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

时间:2009-10-08 22:14:10

标签: c# foreach

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

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

13 个答案:

答案 0 :(得分:21)

你必须自己创建一个

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

或者你可以做一个for循环。

答案 1 :(得分:16)

我在MiscUtil中有一个类型可以帮助解决这个问题 - SmartEnumerable。这是一个愚蠢的名字,但它的工作原理:)请参阅usage page了解详情,如果你使用的是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;
}

答案 2 :(得分: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;
}

答案 3 :(得分:5)

你实际上不这样做。 foreach的一个美女是你没有额外的代码处理集来增加和检查长度。

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

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

答案 4 :(得分:2)

int rowIndex = temptable.Rows.IndexOf(temprow);

答案 5 :(得分:1)

使用标准的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) 
{
  ...
});

答案 6 :(得分:1)

嘿,我认为有一种更快的方式。不需要迭代! 首先,为DataRow的Friend RowID字段声明一个静态变量:

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

然后你需要做的就是:

RowIDFieldInfo.GetValue(MyDataRow) - 1

我没有在求助或过滤后对此进行测试。 在我的情况下,我没有必要这样做,所以这是有效的。

答案 7 :(得分:1)

迟到总比不上......

import QtQuick 2.6
import QtQuick.Window 2.2
import QtQuick.Dialogs 1.2
import Qt.labs.settings 1.0

Window {
Component.onCompleted: {
    openDialog.open();
}

FileDialog {
    id: openDialog
    selectFolder: true
    Component.onCompleted:  folder = settings.lastFolderURL;
    onVisibleChanged:
    {
        console.log("lastFolder as string " + settings.lastFolderString);
        console.log("lastFolder as URL " + settings.lastFolderURL);
    }
    onAccepted:
    {
        console.log("Selected folder : " + folder)
        settings.lastFolderString = folder;
        settings.lastFolderURL = folder;
    }
}

Settings {
    id: settings
    property string lastFolderString ;
    property url lastFolderURL;
}
}

答案 8 :(得分:1)

输入任何单元格编号并获取RowIndex


foreach (var item in datagridview.Rows)
   {
     //TextBox1.Text= item.Cells[0].RowIndex.ToString();
   }

答案 9 :(得分:0)

使用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;
}

答案 10 :(得分:0)

您可以使用标准for循环来获取索引

for(int i=0; i<temptable.Rows.Count; i++)
{
   var index = i;
   var row = temptable.Rows[i];
}

答案 11 :(得分:0)

虽然LFSR的答案是正确的,但我很确定几乎任何集合/列表都会调用.IndexOf来枚举列表,直到找到匹配的行。对于大型DataTable,这可能很慢。

对于表格上的(i = 0; i&lt; temptable.Rows.Count; i ++){...}可能更好。这样你就可以获得索引,而无需征收索引税。

答案 12 :(得分:0)

使用索引而不是使用列名来检索数据的另一种方法

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

希望有帮助