2013-05-29 20 views
10

Danh sách 1 chứa các mục {A, B} và List2 chứa các mục {A, B, C}.Sử dụng LINQ Ngoại trừ không hoạt động như tôi nghĩ

Điều tôi cần phải được trả lại {C} khi tôi sử dụng Ngoại trừ phần mở rộng Linq. Thay vào đó tôi được trả về {A, B} và nếu tôi lật các danh sách trong biểu thức của tôi thì kết quả là {A, B, C}.

Tôi có hiểu nhầm điểm Ngoại trừ không? Có phần mở rộng nào khác mà tôi không thấy sử dụng không?

Tôi đã xem xét và thử một số bài đăng khác nhau về vấn đề này mà không thành công cho đến nay.

var except = List1.Except(List2); //This is the line I have thus far

CHỈNH SỬA: Có Tôi đã so sánh các đối tượng đơn giản. Tôi chưa bao giờ sử dụng IEqualityComparer, nó là thú vị để tìm hiểu về.

Cảm ơn tất cả vì sự giúp đỡ. Vấn đề không được thực hiện so sánh. Bài đăng trên blog được liên kết và ví dụ bên dưới hữu ích.

+1

Danh sách đó có những gì chính xác? –

+0

Loại dữ liệu của các mục của bạn là gì. Nó là một lớp sao? Liên kết này có thể giúp bạn http://stackoverflow.com/questions/1645891/why-isnt-except-linq-comparing-things-properly-using-iequatable – arunlalam

+0

Chúng là những đối tượng đơn giản với một vài thuộc tính cho thời điểm này. Tôi sẽ xem qua liên kết của bạn. – Schanckopotamus

Trả lời

10

Nếu bạn đang lưu trữ các loại tham chiếu trong danh sách của mình, bạn phải đảm bảo có cách so sánh các đối tượng để bình đẳng. Nếu không, họ sẽ được kiểm tra bằng cách so sánh nếu họ tham chiếu đến cùng một địa chỉ.

Bạn có thể triển khai IEqualityComparer<T> và gửi làm tham số cho hàm Except(). Dưới đây là blog post bạn có thể thấy hữu ích.

+0

Để rõ ràng đây là giải pháp giải quyết vấn đề của tôi từ lâu và là một lựa chọn khả thi, tùy thuộc vào kịch bản của bạn. – Schanckopotamus

6

Bạn chỉ cần nhầm lẫn thứ tự các đối số. Tôi có thể thấy nơi sự nhầm lẫn này nảy sinh, bởi vì official documentation không phải là hữu ích vì nó có thể là:

Tạo sự khác biệt tập hợp của hai chuỗi bằng cách sử dụng comparer bình đẳng mặc định để so sánh giá trị.

Trừ khi bạn đang thành thạo trong lý thuyết tập hợp, nó có thể không được rõ ràng những gì một set difference thực sự là — nó không phải chỉ đơn giản là những gì khác nhau giữa các bộ. Trong thực tế, Except trả về danh sách các phần tử trong tập đầu tiên không nằm trong tập thứ hai.

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

var except = List2.Except(List1); // { C } 
+0

Nếu thay đổi thứ tự danh sách tôi nhận được {A, B, C} – Schanckopotamus

4

Vì vậy, chỉ cho đầy đủ ...

// Except gives you the items in the first set but not the second 
    var InList1ButNotList2 = List1.Except(List2); 
    var InList2ButNotList1 = List2.Except(List1); 
// Intersect gives you the items that are common to both lists  
    var InBothLists = List1.Intersect(List2); 

Edit: Từ danh sách của bạn có chứa đối tượng mà bạn cần phải vượt qua trong một IEqualityComparer cho lớp học của bạn ... Đây là những gì ngoại trừ của bạn sẽ giống như với một IEqualityComparer mẫu dựa trên các đối tượng đã tạo ... :)

// Except gives you the items in the first set but not the second 
     var equalityComparer = new MyClassEqualityComparer(); 
     var InList1ButNotList2 = List1.Except(List2, equalityComparer); 
     var InList2ButNotList1 = List2.Except(List1, equalityComparer); 
// Intersect gives you the items that are common to both lists  
     var InBothLists = List1.Intersect(List2); 

public class MyClass 
{ 
    public int i; 
    public int j; 
} 

class MyClassEqualityComparer : IEqualityComparer<MyClass> 
{ 
    public bool Equals(MyClass x, MyClass y) 
    { 
     return x.i == y.i && 
       x.j == y.j; 
    } 

    public int GetHashCode(MyClass obj) 
    { 
     unchecked 
     { 
      if (obj == null) 
       return 0; 
      int hashCode = obj.i.GetHashCode(); 
      hashCode = (hashCode * 397)^obj.i.GetHashCode(); 
      return hashCode; 
     } 
    } 
} 
+0

InList1ButNotList2 cho là {C, B, A}, đó là những gì đã xảy ra. – Schanckopotamus

+0

@Schanckopotomus Ahh ... danh sách của bạn là các đối tượng và các thuộc tính của chúng bằng nhau nhưng các đối tượng không tham chiếu bằng nhau phải không? – Kevin

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