在使用foreach迭代时如何知道行索引?

Lui*_*cio 8 c# foreach

在下一个示例中,我如何知道当前行索引?

foreach (DataRow temprow in temptable.Rows)
{
//this.text = temprow.INDEX????
}
Run Code Online (Sandbox Code Playgroud)

Jos*_*eph 22

你必须自己创建一个

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

或者你可以只做一个for循环.

  • +1,虽然我很少(如果有的话)主张`for`而不是'foreach`.不同的存储机制可以在基于索引的查找(例如链接列表)上执行得非常差,并且在直接枚举上非常好. (5认同)

Jon*_*eet 16

我在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;
}
Run Code Online (Sandbox Code Playgroud)


adr*_*nks 13

如果你可以使用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;
}
Run Code Online (Sandbox Code Playgroud)


Nic*_*ore 5

int rowIndex = temptable.Rows.IndexOf(temprow);
Run Code Online (Sandbox Code Playgroud)

  • 我建议反对这一点。它可能比使用自己的增量器花费更多。 (3认同)

Fil*_*erg 5

你实际上不.foreach的一个优点是你没有额外的代码处理集来增加和检查长度.

如果你想拥有自己的索引,你必须做这样的事情

int rowindex = 0;
foreach (DataRow temprow in temptable.Rows)
{
//this.text = temprow.INDEX????
    this.text = rowindex++;
}
Run Code Online (Sandbox Code Playgroud)