За каждый получим RowIndex - PullRequest
1 голос
/ 09 мая 2009

Есть ли способ для каждого получить индекс строки?

Пример:

int rowIndex = 0;
foreach (int a in numbers)
{
    // Manipulation
    rowIndex++;
}

Что бы я хотел иметь

foreach (int a in numbers)
{
    a.RowIndex;
}

Есть ли быстрый способ сделать это? Может быть, с использованием методов расширения?

Ответы [ 2 ]

4 голосов
/ 09 мая 2009

Попробуйте следующее

foreach ( var item in numbers.Select( (x,i) => new { Index = i, Value = x })) {
  var index = item.Index;
  var value = item.Value;
  ...
}

Существует перегрузка выбора, которая передается по индексу элемента. Этот код создаст новый анонимный тип для каждого элемента, который включает в себя как индекс, так и значение.

Вот альтернативный способ, который делает синтаксис немного более читабельным.

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

numbers.ForEach( (x,i) =>
{
  // x is the value and i is the index
}

Это не добавляет много к определению локального и увеличивает его вручную. Есть ли конкретная причина, по которой вы не хотите делать это таким образом?

0 голосов
/ 09 мая 2009

Это, наверное, самый простой способ, если вы собираетесь придерживаться цикла foreach. Ничего подобного, но я думаю, что это лучший путь.

int rowIndex = 0;
foreach (int a in numbers)
{
    rowIndex++; // You could of course inline this wherever rowIndex first
                // gets used, and then simply reference rowIndex (without
                // the increment) later.

    // ...
}

Но как только вы начнете это делать, вероятно, в любом случае лучше всего просто использовать обычный цикл for (если вы не можете этого сделать, потому что коллекция реализует только IEnumerable, а не IList / ICollection, конечно).

...