2009-10-08 25 views

Trả lời

15

Tôi có một loại trong MiscUtil có thể trợ giúp việc này - SmartEnumerable. Đó là một tên ngu ngốc, nhưng nó hoạt động :) Xem usage page để biết chi tiết, và nếu bạn đang sử dụng C# 3 bạn có thể làm cho nó thậm chí còn đơn giản hơn:

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 cho Tên :) – nawfal

20

Bạn phải tạo một mình

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

hoặc bạn chỉ có thể làm một vòng lặp for để thay thế.

+5

+1, mặc dù tôi hiếm khi (nếu có) ủng hộ một 'for' thay vì' foreach'. Các cơ chế lưu trữ khác nhau có thể thực hiện rất kém trên các tra cứu dựa trên chỉ mục (ví dụ như một danh sách được liên kết) và rất tốt trên một liệt kê thẳng. –

+0

@Adam Có thể hiểu được, đo lường có lẽ là điều tốt nhất để tìm ra cách nào sẽ tốt hơn. – Joseph

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

Tôi sẽ tư vấn chống lại điều đó. Nó có lẽ sẽ chi phí nhiều hơn so với sử dụng gia tăng của riêng bạn. –

+0

Tôi thiết lập một phần breakpoint một cách trong vòng lặp foreach chạy dài trong khi thử nghiệm và sử dụng nó trong một cửa sổ xem để giúp xác định bao lâu tôi đã phải đi. Đủ tốt để gỡ lỗi :) – NotMe

0

Hoặc sử dụng cho vòng lặp, hoặc sử dụng một số nguyên theo cùng:

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

Bạn thực sự không. Một trong những người đẹp với foreach là bạn không có thêm bộ xử lý mã gia tăng và kiểm tra độ dài.

Nếu bạn muốn có chỉ số riêng của bạn, bạn sẽ phải làm một cái gì đó như thế này

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

Đó là không thể với một vòng lặp foreach chuẩn. Cách đơn giản nhất là sử dụng một vòng lặp for

for (int i = 0; i < temptable.Rows.Count; i++) { 
    DataRow temprow = (DataRow)temptable.Rows[i]; 
    ... 
} 

Một lựa chọn khác là sử dụng một phương pháp khuyến nông

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

Bạn có thể sử dụng các tiêu chuẩn for vòng lặp để có được chỉ số

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

Trong khi câu trả lời của LFSR là đúng, tôi khá chắc chắn gọi .IndexOf trên chỉ là về bất kỳ bộ sưu tập/danh sách sẽ liệt kê danh sách cho đến khi nó tìm thấy một hàng phù hợp. Đối với DataTable lớn, điều này có thể chậm.

Có thể tốt hơn cho (i = 0; i < temptable.Rows.Count; i ++) {...} trên bảng. Bằng cách đó bạn có chỉ mục mà không áp đặt thuế chỉ mục.

11

Nếu bạn có thể sử dụng LINQ, bạn có thể làm theo cách này :

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

Người đàn ông, tôi vừa nhập câu trả lời này ... oh well –

+0

Yêu thích! Cảm ơn, bồ tèo! – Lukas

1

Xin chào, tôi nghĩ nhanh hơn rất nhiều. Không cần lặp lại! Thứ nhất, khai báo một biến tĩnh cho bạn bè ROWID Field of DataRow:

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

Sau đó, Tất cả bạn cần làm gì để sử dụng nó là:

RowIDFieldInfo.GetValue(MyDataRow) - 1 

tôi đã không kiểm tra này sau khi resorting hoặc lọc . Trong trường hợp của tôi, tôi không cần phải làm điều đó, vì vậy nó hoạt động.

1

Muộn còn hơn không bao giờ ...

foreach (DataRow temprow in temptable.Rows) 
{ 
    temptable.Rows.IndexOf(temprow); 
} 
Các vấn đề liên quan