2011-10-10 14 views
7

Giả sử tôi có vòng lặp sau:Làm cách nào để hạn chế vòng lặp foreach n chạy?

foreach (DataRow dr in table.rows) 
{ 
    ... 
} 

Làm thế nào để giữ cho nó khỏi chạy thường xuyên hơn lần n?

+2

Dành cho người mới sử dụng mmer, hãy chắc chắn để xem xét các câu trả lời mà làm quầy rõ ràng trong vòng, ngay cả khi bạn cuối cùng đi cho một trong các phương pháp 'Take (50)'. –

+0

@AnthonyPegram: Đề xuất rất tốt cho người đang học. –

Trả lời

9

Bạn có thể thử

using System.Linq; 
... 
... 
... 
foreach (DataRow dr in rows.Cast<DataRow>().Take(50)) { } 

Lưu ý rằng bạn phải gọi Cast<DataRow>() để chuyển đổi DataRowCollection-IEnumerable<DataRow>, mà sẽ cho phép bạn sử dụng phương pháp Take() mở rộng.

+0

Bạn đã thử mã này chưa? Không có phương thức 'Take' trực tiếp có sẵn cho' DataRowCollection'. –

+0

@James - xem chỉnh sửa ;-) –

3

Lựa chọn 1: Có một bộ đếm chạy:

var i = 0; 
foreach (DataRow dr in rows) 
{ 
    i++; 
    if(i >= 50) break; 
} 

Phương án 2: Sử dụng cho vòng lặp

for(int i = 0; i <= 50; i++) { 
    // This might actually crash if there are fewer than 50 rows 
    var row = rows[i]; 
} 
3

Lý tưởng nhất, sửa đổi truy vấn ban đầu của bạn để chỉ trả lại 50 dòng. Không có điểm nào trong việc tìm nạp nhiều hơn bạn muốn sử dụng.

Những người khác đã cung cấp lựa chọn thay thế tốt nếu đây không phải là một tùy chọn.

18

Trong trường hợp rows thực sự là chỉ từ DataTable.Rows, các Take câu trả lời đơn giản nhất định sẽ không làm việc như DataRowCollection chỉ thực hiện các giao diện phi generic IEnumerable, trong khi đó LINQ cần một generic. Bạn sẽ cần một cái gì đó như:

// Uses DataTableExtensions.AsEnumerable 
foreach (DataRow dr in table.AsEnumerable().Take(50)) 

hoặc

// Uses Enumerable.Cast 
foreach (DataRow dr in rows.Cast<DataRow>().Take(50)) 
+0

Bạn đã khiến tôi do dự để sửa lỗi chính tả;) Dấu cộng ở cuối ví dụ thứ hai có chủ ý không? –

+0

@JamesJohnson: Không, chỉ là lỗi đánh máy lần này :) –

+0

Đây có phải là câu trả lời được chấp nhận không? – xpereta

1

Hãy thử điều này:

foreach (DataRow dr in table.Rows.Cast<DataRow>().Take(50)) 
{ 
    //your logic 
} 
0

Các cách tiếp cận .Cast<DataRow>().Take(50) LINQ cũng tốt, nhưng điều này thực sự là một vấn đề đơn giản cho một vòng lặp for :

for(int i = 0; i < Math.Min(50, rows.Count); ++i) 
{ 
    var row = rows[i]; 
} 
Các vấn đề liên quan