2009-10-08 24 views
7

在下一個示例中,我如何知道當前行索引?如何在使用foreach迭代時知道行索引?

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

的[(C#)獲取當前的foreach迭代指數(可能重複http://stackoverflow.com/questions/43021/c-get-index-當前foreach迭代) – sloth 2012-06-12 14:08:16

回答

15

我有一個在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; 
} 
+0

+1爲名:) – nawfal 2013-09-21 13:02:25

20

你必須創建一個自己

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

,或者你可以只是循環做代替。

+5

+1,但我很少(如果有的話)主張'for'而不是'foreach'。不同的存儲機制在基於索引的查找(例如鏈表)方面表現很差,並且在直接枚舉時效果非常好。 – 2009-10-08 22:18:45

+0

@亞當可以理解,測量可能是找出哪種方式更好的最好方法。 – Joseph 2009-10-08 22:20:15

1
int rowIndex = temptable.Rows.IndexOf(temprow); 
+2

我會反對這個建議。這可能會比使用自己的增量器花費更多。 – 2009-10-08 22:17:40

+0

我在測試時在長時間運行的foreach循環中設置了一個斷點部分路徑,並在觀察窗口中使用它來幫助確定我必須走多長時間。足夠用於調試:) – NotMe 2016-07-12 15:10:49

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; 
} 
5

你其實並不。有foreach的美女之一是你沒有額外的一套代碼處理遞增和檢查的長度。

如果你想擁有自己的指數,你會做這樣的事情

int rowindex = 0; 
foreach (DataRow temprow in temptable.Rows) 
{ 
//this.text = temprow.INDEX???? 
    this.text = rowindex++; 
} 
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) 
{ 
    ... 
}); 
0

您可以使用標準的for循環得到指數

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

雖然LFSR的答案是正確的,但我確定調用.IndexOf幾乎任何集合/列表都會枚舉列表,直到找到匹配的行。對於大型DataTable,這可能會很慢。

對於(i = 0; i < temptable.Rows.Count; i ++){...}可能會更好。這樣你就可以得到索引而不需要徵收索引稅。

11

如果你可以使用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; 
} 
+0

男人,我只是要進入這個響應......哦,還有 – 2009-10-08 22:42:04

+0

喜歡它!謝謝! – Lukas 2013-10-14 23:10:47

1

嘿,我覺得有更快的方式。不需要迭代! 首先聲明一個靜態變量DataRow中的朋友的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 

訴諸或過濾後,我沒有測試過這。 在我的情況下,我沒有必要這樣做,所以這個工作。

1

優於從不遲到......

foreach (DataRow temprow in temptable.Rows) 
{ 
    temptable.Rows.IndexOf(temprow); 
} 
相關問題