2013-08-07 44 views
13

Tôi có hai danh sách:So sánh hai danh sách và trả lại giá trị khác biệt và sự khác biệt

List A {A, B, C, D} 

List B {A, E, F, G} 

tôi cần phải tạo ra ba danh sách:

Một với các mặt hàng chỉ trong danh sách Một

(B, C, D)

Một chỉ có các mục trong danh sách B

(E, F, G)

Một với các mục trong cả

(A)

Cho rằng danh sách đang thực sự các khóa registry, có thể có một số lượng lớn trong số họ vì vậy tôi có thể thấy trước một trên không hiệu quả rất lớn nếu tôi chọn sử dụng các phương thức ForEach hoặc For (int i ...) truyền thống.

Tôi không chống lại những điều này nếu chúng thực hiện công việc một cách hiệu quả nhưng tôi muốn sử dụng LINQ.

Có ai có ý tưởng nào không?

Tôi không quan tâm đến các bản ghi giống hệt nhau.

Tôi đã tạo một lớp học IEquatable<> sẽ so sánh các yếu tố, nhưng đó là cách sử dụng để tạo ra các kết quả đầu ra cần thiết mà tôi đang gặp khó khăn.

Xin cảm ơn trước.

Bằng cách này tôi đang sử dụng VS2012 với .NET 4.5

+0

Cho chúng tôi thấy các lớp học có liên quan. – Jon

Trả lời

18
var A = new List<string>() { "A", "B", "C", "D" }; 
var B = new List<string>() { "A", "E", "F", "G" }; 

A.Except(B).ToList() 
// outputs List<string>(2) { "B", "C", "D" } 
B.Except(A).ToList() 
// outputs List<string>(2) { "E", "F", "G" } 
B.Intersect(A).ToList() 
// outputs List<string>(2) { "A" } 
+0

Về mặt kỹ thuật OP sai, B chỉ nằm trong danh sách A và E chỉ trong danh sách B, vì vậy hai Ngoại lệ là khác nhau :-) – xanatos

+1

Yeah output1 shud có B, C, D và output2 shud có E, F, G. ... –

+0

oops, đầu ra từ B = A, B, F, G, sai init trong mã của tôi. Thay đổi đầu ra :) sry cho rằng –

5

Sử dụng LINQ

listA.Except(listB) 

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

Đối với tương tự

listA.SequenceEqual(listB) 
Các vấn đề liên quan