2012-03-01 28 views
28

Tôi có hai danh sách:Tìm nếu Lista chứa bất kỳ yếu tố không listB

List<int> listA  
List<int> listB 

Làm thế nào để kiểm tra sử dụng LINQ nếu trong listA tồn tại một yếu tố wchich deosn't tồn tại trong listB? Tôi có thể sử dụng foreach loop nhưng tôi tự hỏi nếu tôi có thể làm điều này bằng cách dùng LINQ

Trả lời

72

listA.Except(listB) sẽ cung cấp cho bạn tất cả các mục trong Lista mà không phải là trong listB

+1

Có, nó sẽ làm điều này. Nhưng vì đây là một hoạt động dựa trên thiết lập nên đáng nhớ rằng danh sách kết quả cũng sẽ loại bỏ các bản sao có trong ListA hoặc ListB. – Holf

32
if (listA.Except(listB).Any()) 
4

Bạn có thể làm điều đó trong một dòng

var res = listA.Where(n => !listB.Contains(n)); 

Đây không phải là cách nhanh nhất để làm điều đó: trong trường hợp listB là tương đối dài, điều này cần được nhanh hơn:

var setB = new HashSet(listB); 
var res = listA.Where(n => !setB.Contains(n)); 
11
listA.Any(_ => listB.Contains(_)) 

:)

+1

Điều này là anwser tốt nhất, bởi vì các giải pháp được cung cấp bởi @ cadrell0 và SLaks sẽ chỉ kiểm tra xem A có chứa tất cả các phần tử của B nhưng không nếu B có thêm bất kỳ phần tử nào không khớp A. Giải pháp này là hợp lệ ví dụ bên dưới. A: [0,1,2,3]; B: [0,1,2,3,4] 'listA.Except (listB) .Any() == false' ' listA.Any (_ => listB.Contains (_)) == true' –

+0

@ TomaszJuszczak Đúng, nhưng câu hỏi đặc biệt chỉ hỏi nếu A chứa bất cứ điều gì không có trong B - nghĩa là nó ** nên ** đánh giá sai nếu B chứa một cái gì đó không có trong A được cung cấp A không chứa một cái gì đó không có trong B. Vì vậy, câu trả lời này là sai. (Phải, tôi đã hiểu sai câu hỏi khi lần đầu đọc.) –

2

Danh sách có phương pháp Chứa trả lại bool. Chúng ta có thể sử dụng phương thức đó trong truy vấn.

List<int> listA = new List<int>(); 
List<int> listB = new List<int>(); 
listA.AddRange(new int[] { 1,2,3,4,5 }); 
listB.AddRange(new int[] { 3,5,6,7,8 }); 

var v = from x in listA 
     where !listB.Contains(x) 
     select x; 

foreach (int i in v) 
    Console.WriteLine(i); 
0

Đoạn mã này so sánh hai danh sách chứa cả trường cho mã văn hóa như 'en-GB'. Điều này sẽ để lại các bản dịch không tồn tại trong danh sách. (chúng tôi cần danh sách thả xuống cho các ngôn ngữ không được dịch cho bài viết)

var compared = supportedLanguages.Where(sl => !existingTranslations.Any(fmt => fmt.CultureCode == sl.Culture)).ToList();

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