Как узнать индекс строки при итерации с foreach? - PullRequest
8 голосов
/ 09 октября 2009

в следующем примере, как узнать текущий индекс строки?

foreach (DataRow temprow in temptable.Rows)
{
//this.text = temprow.INDEX????
}

Ответы [ 13 ]

21 голосов
/ 09 октября 2009

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

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

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

16 голосов
/ 09 октября 2009

У меня есть тип 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;
}
13 голосов
/ 09 октября 2009

Если вы можете использовать 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;
}
5 голосов
/ 09 октября 2009

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

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

int rowindex = 0;
foreach (DataRow temprow in temptable.Rows)
{
//this.text = temprow.INDEX????
    this.text = rowindex++;
}
2 голосов
/ 09 октября 2009
int rowIndex = temptable.Rows.IndexOf(temprow);
1 голос
/ 17 сентября 2018

Напишите любой номер ячейки и получите RowIndex


foreach (var item in datagridview.Rows)
   {
     //TextBox1.Text= item.Cells[0].RowIndex.ToString();
   }
1 голос
/ 11 октября 2017

Лучше поздно, чем никогда ...

foreach (DataRow temprow in temptable.Rows)
{
    temptable.Rows.IndexOf(temprow);
}
1 голос
/ 11 мая 2012

Эй, я думаю, что есть гораздо более быстрый способ. Итерации не требуется! Сначала объявите статическую переменную для поля Friend RowID в DataRow:

Private Shared RowIDFieldInfo As System.Reflection.FieldInfo = GetType(DataRow).GetField("_rowID", System.Reflection.BindingFlags.NonPublic Or System.Reflection.BindingFlags.Instance)

Тогда все, что вам нужно сделать, чтобы использовать его:

RowIDFieldInfo.GetValue(MyDataRow) - 1

Я не проверял это после применения или фильтрации. В моем случае мне это не нужно, так что это работает.

1 голос
/ 09 октября 2009

Это невозможно со стандартным циклом 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) 
{
  ...
});
0 голосов
/ 04 января 2019

Альтернативный способ получения данных с использованием индекса вместо имени столбца

foreach (DataRow temprow in temptable.Rows)
{
    String col1 = temprow[0].ToString().Trim();
    String col2 = temprow[1].ToString().Trim();
}

Надеюсь, это поможет

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