Цикл Foreach, определите, какая последняя итерация цикла - DataRow - PullRequest
0 голосов
/ 17 марта 2019

Пожалуйста, посмотрите на эту ссылку .
Теперь у меня есть foreach, подобный этому:

//DataRow last = dsRequests.Tables["Requests"].Rows.Last();

foreach (DataRow drRequests in dsRequests.Tables["Requests"].Rows)
{
}

Я хочу определить последнюю итерацию цикла foreach.
Итак, я попробовал это:

DataRow last = dsRequests.Tables["Requests"].Rows.Last();

Но у меня есть эта ошибка:

Ошибка CS1061 «DataRowCollection» не содержит определения «Последний» и без метода расширения »Может быть найден последний «принимающий первый аргумент типа« DataRowCollection »(отсутствует директива using или ссылка на сборку?)

Как я могу это сделать?

1 Ответ

2 голосов
/ 17 марта 2019

Вы можете просто написать

 DataRow last = dsRequests.Tables["Requests"].AsEnumerable().LastOrDefault();
 if(last != null)
     .....

заставляет DataTable быть перечисляемым, тогда вы можете использовать LastOrDefault () . Обратите внимание, что я использую LastOrDefault , потому что, если таблица пуста, Last () даст вам исключение.

Другой подход заключается в использовании старомодного индекса для коллекции Rows

    DataRow last = null;
    int idx = dsRequests.Tables["Requests"].Rows.Count;
    if(idx > 0) last = dsRequests.Tables["Requests"].Rows[idx -1];
    if(last != null)
        ....

В этом примере вы должны проверить количество строк после получения количества.

Я также должен добавить, что последний пример, использующий индекс для доступа к последней строке, более производительный. Однако мои тесты показывают, что в цикле 100000 разница составляет всего 40 миллисекунд. Не о чем беспокоиться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...