在下一個示例中,我如何知道當前行索引?如何在使用foreach迭代時知道行索引?
foreach (DataRow temprow in temptable.Rows)
{
//this.text = temprow.INDEX????
}
在下一個示例中,我如何知道當前行索引?如何在使用foreach迭代時知道行索引?
foreach (DataRow temprow in temptable.Rows)
{
//this.text = temprow.INDEX????
}
我有一個在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;
}
+1爲名:) – nawfal 2013-09-21 13:02:25
你必須創建一個自己
var i = 0;
foreach (DataRow temprow in temptable.Rows)
{
this.text = i;
// etc
i++;
}
,或者你可以只是循環做代替。
+1,但我很少(如果有的話)主張'for'而不是'foreach'。不同的存儲機制在基於索引的查找(例如鏈表)方面表現很差,並且在直接枚舉時效果非常好。 – 2009-10-08 22:18:45
@亞當可以理解,測量可能是找出哪種方式更好的最好方法。 – Joseph 2009-10-08 22:20:15
int rowIndex = temptable.Rows.IndexOf(temprow);
我會反對這個建議。這可能會比使用自己的增量器花費更多。 – 2009-10-08 22:17:40
我在測試時在長時間運行的foreach循環中設置了一個斷點部分路徑,並在觀察窗口中使用它來幫助確定我必須走多長時間。足夠用於調試:) – NotMe 2016-07-12 15:10:49
要麼使用一個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;
}
你其實並不。有foreach的美女之一是你沒有額外的一套代碼處理遞增和檢查的長度。
如果你想擁有自己的指數,你會做這樣的事情
int rowindex = 0;
foreach (DataRow temprow in temptable.Rows)
{
//this.text = temprow.INDEX????
this.text = rowindex++;
}
這是不可能的使用標準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)
{
...
});
您可以使用標準的for
循環得到指數
for(int i=0; i<temptable.Rows.Count; i++)
{
var index = i;
var row = temptable.Rows[i];
}
雖然LFSR的答案是正確的,但我確定調用.IndexOf幾乎任何集合/列表都會枚舉列表,直到找到匹配的行。對於大型DataTable,這可能會很慢。
對於(i = 0; i < temptable.Rows.Count; i ++){...}可能會更好。這樣你就可以得到索引而不需要徵收索引稅。
如果你可以使用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;
}
男人,我只是要進入這個響應......哦,還有 – 2009-10-08 22:42:04
喜歡它!謝謝! – Lukas 2013-10-14 23:10:47
嘿,我覺得有更快的方式。不需要迭代! 首先聲明一個靜態變量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
訴諸或過濾後,我沒有測試過這。 在我的情況下,我沒有必要這樣做,所以這個工作。
優於從不遲到......
foreach (DataRow temprow in temptable.Rows)
{
temptable.Rows.IndexOf(temprow);
}
的[(C#)獲取當前的foreach迭代指數(可能重複http://stackoverflow.com/questions/43021/c-get-index-當前foreach迭代) – sloth 2012-06-12 14:08:16