Как я могу знать индекс строки при итерации с foreach?

Равенство действительно является специальным видом отношения эквивалентности на самом деле. Рассмотрите то, что это означает говорить:

0.9999999999999999... = 1

, Который предполагает, что равенство является просто отношением эквивалентности на "строковых числах" (которые определяются более официально как функции от Z-> {0..., 9}). И мы видим от этого случая, классы эквивалентности даже не являются одиночными элементами.

8
задан Luiscencio 8 October 2009 в 11:14
поделиться

9 ответов

У меня есть тип в MiscUtil , который может с этим помочь - SmartEnumerable . Это глупое имя, но оно работает :) Подробности см. На странице использования , а если вы используете C # 3, вы можете сделать его еще проще:

foreach (var item in temptable.Rows.AsSmartEnumerable())
{
    int index = item.Index;
    DataRow value = item.Value;
    bool isFirst = item.IsFirst;
    bool isLast = item.IsLast;
}
16
ответ дан 3 November 2019 в 12:07
поделиться

Вы должны создать его сами

var i = 0;
foreach (DataRow temprow in temptable.Rows)
{
    this.text = i;
    // etc
    i++;
}

или вместо этого можете просто выполнить цикл for.

22
ответ дан 3 November 2019 в 12:07
поделиться

Если вы можете использовать Linq, вы можете сделать это следующим образом:

foreach (var pair in temptable.Rows.Cast<DataRow>()
                                   .Select((r, i) => new {Row = r, Index = i}))
{
    int index = pair.Index;
    DataRow row = pair.Row;
}
13
ответ дан 3 November 2019 в 12:07
поделиться

На самом деле вы этого не делаете. Одно из достоинств foreach заключается в том, что у вас нет дополнительного набора обработки кода, увеличивающего и проверяющего длину.

Если вы хотите иметь свой собственный Индекс, вам придется сделать что-то вроде этого

int rowindex = 0;
foreach (DataRow temprow in temptable.Rows)
{
//this.text = temprow.INDEX????
    this.text = rowindex++;
}
5
ответ дан 3 November 2019 в 12:07
поделиться
int rowIndex = temptable.Rows.IndexOf(temprow);
3
ответ дан 3 November 2019 в 12:07
поделиться

Это невозможно со стандартным циклом foreach. Самый простой способ - использовать цикл for

for ( int i = 0; i < temptable.Rows.Count; i++ ) {
  DataRow temprow = (DataRow)temptable.Rows[i];
  ...
}

Другой вариант - использовать метод расширения

public static void ForEachIndex<T>(this IEnumerable<T> e, Action<T,int> del) {
  var i = 0; 
  foreach ( var cur in e ) {
    del(cur,i);
  }
}

...

temptable.Rows.Cast<DataRow>.ForEachIndex((cur,index) 
{
  ...
});
1
ответ дан 3 November 2019 в 12:07
поделиться

Либо используйте цикл for, либо используйте целое число, следующее:

int count =0;
foreach (DataRow temprow in temptable.Rows)
{
    //count is the index of the row in the array temptable.Rows
    //this.text = temprow.INDEX????
    ++count;
}
0
ответ дан 3 November 2019 в 12:07
поделиться

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

for(int i=0; i<temptable.Rows.Count; i++)
{
   var index = i;
   var row = temptable.Rows[i];
}
0
ответ дан 3 November 2019 в 12:07
поделиться

Хотя ответ LFSR правильный, я почти уверен, что вызов .IndexOf практически для любой коллекции / списка будет перечислять список до тех пор, пока не найдет соответствующую строку. Для больших DataTable это может быть медленным.

Может быть, лучше для (i = 0; i

0
ответ дан 3 November 2019 в 12:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: