Как "сдвинуть" коллекцию от n до m элементов?
У меня есть форма с кнопками "вперед" и "назад" условно. При нажатии на кнопку вперед, показываются следующие 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)]);
}
Ответы (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