Как "сдвинуть" коллекцию от n до m элементов?

213
17 апреля 2022, 16:30

У меня есть форма с кнопками "вперед" и "назад" условно. При нажатии на кнопку вперед, показываются следующие 5 элементов коллекции или оставшиеся элементы и при нажатии на назад соответственно предыдущие 5

HTML:

<div class="text-center">
    <form asp-action="Index">
        <button class="btn btn-dark" value="-5" name="shift">Вперед</button>
        <button class="btn btn-dark" value="5" name="shift">Назад</button>
    </form>
</div>

В методе "Index" я не могу додуматься как их сдвигать

C#

int _shift;
public async Task<IActionResult> Index(int shift = default)
{
    if (shift == -5) _shift -= shift;
    else if (shift == 5) _shift += shift;
    var games = await db.Games.ToArrayAsync();
    return View(games[_shift..(_shift + 5)]);
}
Answer 1

То, что вы пытаетесь сделать называется пагинацией, разбиением на отдельные страницы.

Для этого во-первых, задаются:

А) числом элементов, которые размещаются на одной странице - PageLimit (обычно 10) и

Б) либо PageNum -- номером текущей страницы (1, 2, 3...) либо PageOffset -- смещением (10, 20, 30 для PageLimit = 10).

(Выбор PageNum или PageOffset имеет свои особенности, оставим это за рамками вопроса.)

Во-вторых, в запросе переходят от выполнения await db.Games.ToArrayAsync() к выборке PageLimit элементов начиная с PageOffset:

var games = await db.Games
                    .Skip(PageOffset)
                    .Take(PageLimit)
                    .ToArrayAsync();

И обычно рассчитываю разные параметры, чтобы блокировать кнопки "вперёд" (при достижении последней страницы) или "назад" если мы находимся на самой первой странице.

Это то, что является базовым уровнем - пагинация для linq на базе limit+offset, ну а далее погружение в тему может быть весьма интересным. Почитайте например:

  • для общего развития более сложные способы пагинации https://habr.com/en/post/301044/
  • про то как делали пагинацию в SQL Server 2008 https://stackoverflow.com/q/109232/5752652
  • про то какие бывают сложные случаи https://habr.com/en/company/rambler_group/blog/306158/
  • самодельная пагинация в asp.net mvc https://metanit.com/sharp/mvc5/5.13.php
READ ALSO
бесконечная 2D анимация заднего фона (C# unity)

бесконечная 2D анимация заднего фона (C# unity)

хочу сделать анимацию заднего фона в простой 2D игре, чтобы при нажатии на клавиши движения, вслед за персонажем начинал в нужную сторону двигаться...

166
Архитектура приложения(игры) на Unity

Архитектура приложения(игры) на Unity

Начал заниматься разработкой игр на UnityПри создании стали возникать проблемы с "чистотой" и "грамотностью" скриптов

191
Залить часть геометрической фигуры

Залить часть геометрической фигуры

Нужна помощь коллективного разума на тему: как залить часть произвольной замкнутой геометрической фигуры?

158
Cоздание истории в Инстаграм c помощью Selenium C# gecko

Cоздание истории в Инстаграм c помощью Selenium C# gecko

Я пытаюсь разместить историю в Инстаграмм с компьютераИспользую Selenium + C# + geckodriver (Console Application)

123