Для цикла, не возвращающего ожидаемое значение — C# — Blazor

#c# #razor #blazor #asp.net-blazor

#c# #для-петли #блейзор

Вопрос:

Используя Blazor, я создаю функцию разбиения на страницы для своего проекта. Основная концепция заключается в том, чтобы просто использовать linq .Skip() и .Take(), я буду брать только элементы списка для страницы, на которую был сделан щелчок, из списка.

Код, который создает кнопки разбиения на страницы: (Например: 1,2,3)

 lt;ul class="pagination float-center"gt;  @for (int i = 0; i lt; Math.Ceiling((decimal)articleService.ReturnAll().Count() / numPerPage); i  )  {  lt;li class="page-item"gt;lt;a class="page-link" onclick="@(() =gt; ReturnPage(i))"gt;@ilt;/agt;lt;/ligt;  } lt;/ulgt;  

Я не возражаю против использования индексации 0 здесь для разбиения на страницы.

Этот приведенный выше код создает кнопки, которые при нажатии (скажем, страница 1, которая является 2-й страницей) передают индекс цикла for, который я позже умножу на количество на страницу, чтобы получить количество элементов в списке, которые нужно пропустить.

Например, при нажатии на страницу 1 мне нужно будет пропустить 2 элемента в списке, а затем перейти к следующим 2. (Предполагая, что мне нужно 2 элемента в качестве суммы на страницу)

Затем моя функция ReturnPage пропустит текущую страницу (что нажато) — 1, затем умножит на 2 (или количество на страницу), чтобы найти общую сумму, которую нужно пропустить. Если пользователь нажимает 0 (первая страница), то мне нужно .Пропустить(0) и просто .Возьмите(количество на страницу).

 void ReturnPage(int i)  {   articles = articleService.ReturnAll()  .OrderByDescending(x =gt; x.LastUpdated)  .Skip((i == 0) ? 0 : (i - 1) == 0 ? numPerPage : (i - 1) * numPerPage)  .Take(numPerPage)  .ToList();  }  

Помещая это в контекст, если у меня есть список (статей) с общим количеством элементов 3. Это вернет мне кнопки разбиения на страницы 0,1. На странице 0 будут показаны 2 элемента, а на странице 1-1 элемент.

Если я нажму кнопку разбиения на страницы 1, я должен передать 1 (i) методу ReturnPage, и это вычислит количество пропущенных элементов 2. Это означает, что на этой странице будут пропущены первые 2 пункта в списке, затем перейдите к следующим 2. (в данном случае только 1 пункт)

Если я нажму кнопку «Вернуться к разбиению на страницы» 0, я должен передать значение i 0, ничего не пропуская, и просто взять первые 2 элемента.

Однако я вообще не вижу, чтобы правильное значение (i) передавалось в функцию ReturnPage.

При выполнении того же примера, который я описал выше, цикл for возвращает правильное количество кнопок: Кнопки Разбиения на Страницы

Но при отладке у меня есть значение 2 (каждый раз?). Что отбрасывает все это .Функция пропуска ().

Неверное Ожидаемое Значение

Моя интерпретация такова, что, полностью игнорируя материал linq, что-то в цикле for неправильно. Это условие кажется мне правильным. Если у меня есть количество 3 и 2 на страницу, что равно 1,5, что будет означать 2 страницы. Таким образом, мои значения i должны быть 0 и 1, но почему-то их 2?

Должно быть, я упускаю здесь что-то фундаментальное, какие-нибудь идеи?

Комментарии:

1. Похоже, ваш код должен делать то, что вы описываете. Вы можете опубликовать полную копию?

Ответ №1:

Ваш цикл for должен содержать локальную переменную, подобную этой:

 @for (int i = 0; i lt; Math.Ceiling((decimal)articleService.ReturnAll().Count() / numPerPage); i  )  {  var localVariable = i;   lt;li class="page-item"gt;lt;a class="page-link" onclick="@(() =gt; ReturnPage(localVariable ))"gt;@ilt;/agt;lt;/ligt;  }  

Это стандартное поведение C#, в котором лямбда-выражение @(() =gt; ReturnPage(LocalVariable )) имеет доступ к переменной, а не к значению переменной. Вы должны определить переменную, локальную для цикла for, иначе ваше лямбда-выражение всегда будет вызывать ReturnPage(i), а i равно математике.Потолок((десятичная)статья).ReturnAll().Count() в конце цикла.

Комментарии:

1. Это сделало свое дело!! Большое вам спасибо! Правильно ли говорить, что, используя только я, он действует почти как ссылочный тип, не будучи ссылочным типом? Т. Е. то, что я передаю на ReturnPage, на самом деле является ссылкой на ячейку памяти i, которая не меняется, но значение продолжает меняться на каждой итерации.

2. Да, значение переменной i вычисляется при вызове выражения lambada, а не при его назначении. Поэтому, если вы вызовете его после выполнения всех итераций цикла, значение переменной i будет таким, каким было конечное значение переменной.