对于每个获取RowIndex

时间:2009-05-09 19:06:17

标签: c# .net-3.5 extension-methods

是否有办法让每个人获得行索引?

示例:

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

我想拥有什么

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

有快速的方法吗?也许使用扩展方法?

2 个答案:

答案 0 :(得分:4)

尝试以下

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

select的重载会传递项目的索引。此代码将为每个项目创建一个新的匿名类型,包括索引和值。

这是一种使语法更具可读性的替代方法。

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
}

这并没有在定义本地上增加很多,而是手动增加它的解决方案。有没有特别的理由你不想那样做?

答案 1 :(得分:0)

如果您要坚持使用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当然)。