2012-09-25 31 views
27

Tôi tự hỏi liệu LINQ có phương pháp kiểm tra xem hai bộ sưu tập có ít nhất một thành phần đơn lẻ không. Tôi sẽ mong đợi một cái gì đó như thế này:Kiểm tra bất kỳ phần tử nào tồn tại trong hai bộ sưu tập

var listA = new List<int>() { some numbers }; 
var listB = new List<int>() { some numbers, potentially also in list A }; 

bool hasSameElements = listA.hasMatchingElements(listB); 

Có tồn tại trong LINQ hoặc tôi nên viết một phương pháp tùy chỉnh cho nó?

Tôi biết phương pháp Intersect, nhưng điều này có mang lại toàn bộ giao lộ không? Tôi chỉ quan tâm đến việc kiểm tra NẾU hai bộ sưu tập giao nhau, năng suất toàn bộ thiết lập có vẻ như một sự lãng phí, đặc biệt là trên các bộ sưu tập lớn hơn.

+0

'Intersect' chỉ cho ra nhiều phần tử như được yêu cầu. Nếu bạn làm theo nó với 'Any', hoặc' FirstOrDefault', hoặc làm một 'foreach' và phá vỡ lần lặp đầu tiên, nó sẽ chỉ tìm thấy phần tử _first_ tồn tại trong cả hai danh sách (nếu có) - nó sẽ không làm phiền tìm phần còn lại. – Rawling

+1

Howver, lưu ý rằng hoạt động 'Intersect' yêu cầu _one_ của hai chuỗi được _completely_ đọc trước khi phần tử đầu tiên có thể được mang lại. Nếu một trong các đầu vào của bạn là vô hạn, hãy đảm bảo nó không phải là đầu vào được tiêu thụ hoàn toàn. Lưu ý rằng [spec] (http://msdn.microsoft.com/en-us/library/bb460136.aspx) cho 'Intersect' _lies_ về cách nó hoạt động. – Rawling

Trả lời

58

Âm thanh như bạn chỉ muốn:

bool hasSameElements = listA.Intersect(listB).Any(); 

EDIT: Như đã nêu trong các ý kiến, Intersect sử dụng đánh giá lười biếng. Nó ngăn chặn tất cả các hoạt động cho đến khi phần tử đầu tiên được đọc từ kết quả; tại thời điểm đó, nó sẽ tải tất cả của listB vào một tập hợp và sau đó phát trực tuyến listA cho đến khi kết quả đạt được. Tại thời điểm đó, Any() sẽ trả về true và do đó sẽ không có thêm công việc nào được thực hiện. Xem số Edulinq post on Intersect của tôi để biết thêm thông tin.

+0

Trước tiên, điều này có mang lại toàn bộ giao lộ không? – zeebonk

+0

Sau đó sử dụng FirstOrDefault()? –

+0

@Lews - không có nhiều trợ giúp với 'int', nếu cả hai danh sách chứa '0' thì sao? – Rawling

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