2012-03-03 33 views
9

enter image description hereCó thể liệt kê nhiều IEnumerable?

tại sao vậy? Làm thế nào tôi có thể sửa chữa nó ?

+1

Tất cả trừ ảnh chụp màn hình cuối cùng và văn bản chỉ phân tâm từ câu hỏi thực. – usr

+1

Điều này rất giống với http://stackoverflow.com/q/7244178/219583. Bất kỳ() nào sẽ được tính là một liệt kê và Tổng hợp() là số thứ hai. –

+9

Không đăng mã dưới dạng ảnh chụp màn hình - dán nguồn vào câu hỏi. – Joe

Trả lời

14

Không có gì để sửa ở đây. Any() sẽ lặp lại liệt kê nhưng dừng sau phần tử đầu tiên (sau đó nó trả về true).

Nhiều enumerations chủ yếu là một vấn đề trong hai trường hợp:

  • Hiệu suất: Nói chung, bạn muốn tránh nhiều lần lặp lại nếu bạn có thể, bởi vì nó là chậm hơn. Điều này không áp dụng ở đây vì Any() sẽ chỉ xác nhận có ít nhất một phần tử và là séc bắt buộc cho bạn. Ngoài ra, bạn không truy cập bất kỳ tài nguyên từ xa/bên ngoài nào, chỉ cần một chuỗi trong bộ nhớ.

  • Các danh sách không thể lặp lại nhiều lần: Ví dụ: nhận các mục từ mạng, v.v. - cũng không áp dụng tại đây.

Là một phiên bản không LINQ rằng chỉ cần lặp khi bạn thể làm như sau:

bool foundAny= false; 
bool isEqual = true; 

if(f == null) 
    throw new ArgumentException(); 

foreach(var check in f) 
{ 
    foundAny = true; 
    isEqual = isEqual && check(p,p2); 
} 

if(!foundAny) 
    throw new ArgumentException(); 

return isEqual; 

Nhưng, như đã nói, trong trường hợp của bạn nó không tạo sự khác biệt, và tôi sẽ đi với phiên bản dễ đọc hơn cho bạn.

+1

Nếu đây là truy vấn cơ sở dữ liệu, nó sẽ thực hiện hai lần, thường là hoàn toàn. – usr

+1

@usr: Đồng ý, tôi đã thêm vào trường hợp đầu tiên - nó tạo sự khác biệt trong trường hợp này cho dù đó là tài nguyên từ xa/bên ngoài hay chuỗi trong bộ nhớ – BrokenGlass

5

Phương pháp Any có thể gây ra việc liệt kê IEnumerable<T>, nếu không có cách nào khác để xác định kết quả. Trong một số trường hợp, nó có thể là một vấn đề, ví dụ nếu trường hợp IEnumerable<T> thực sự là một IQueryable<T>, điều này sẽ làm cho truy vấn cơ sở dữ liệu hoặc cuộc gọi dịch vụ web được thực hiện. Bây giờ, nếu nó chỉ là một bộ sưu tập trong bộ nhớ, nó không thực sự là một vấn đề, bởi vì liệt kê các bộ sưu tập sẽ không có tác dụng phụ đáng chú ý. Và dù sao, Any sẽ sử dụng thuộc tính Count nếu trình tự thực hiện ICollection<T>, do đó, nó sẽ không gây ra điều tra.

Các vấn đề liên quan