2011-11-29 19 views
10

Tôi đã hai danh sách xem dưới đây ..... kết quả sẽ trở lại như trốngIntersect giữa hai danh sách không làm việc

List<Pay>olist = new List<Pay>(); 
List<Pay> nlist = new List<Pay>(); 
Pay oldpay = new Pay() 
{ 
    EventId = 1, 
    Number = 123,       
    Amount = 1 
}; 

olist.Add(oldpay); 
Pay newpay = new Pay() 
{ 
    EventId = 1, 
    Number = 123,       
    Amount = 100 
}; 
nlist.Add(newpay); 
var Result = nlist.Intersect(olist); 

bất kỳ manh mối tại sao?

+0

Giả sử trả bình đẳng là EventID, Số lượng và số lượng, không có gì phổ biến trong hai danh sách đó và do đó không có gì giao nhau. Nói cách khác, bạn chưa định nghĩa bình đẳng ở đây. –

+0

Bạn có ý nghĩa gì đã không xác định sự bình đẳng ở đây? chỉ có phần tử khác là Amount = 100 – user570715

+0

Không có gì trong câu hỏi cho biết _why_ 'oldpay' phải bằng' newpay'. –

Trả lời

21

Bạn cần ghi đè các phương thức EqualsGetHashCode trong lớp Pay của mình, nếu không Intersect sẽ không biết khi nào 2 trường hợp được coi là bằng nhau. Làm thế nào nó có thể đoán rằng nó là EventId xác định sự bình đẳng? oldPaynewPay là các trường hợp khác nhau, do đó theo mặc định chúng không được coi là bằng nhau.

Bạn có thể ghi đè lên các phương pháp trong Pay như thế này:

public override int GetHashCode() 
{ 
    return this.EventId; 
} 

public override bool Equals(object other) 
{ 
    if (other is Pay) 
     return ((Pay)other).EventId == this.EventId; 
    return false; 
} 

lựa chọn khác là để thực hiện một IEqualityComparer<Pay> và vượt qua nó như một tham số để Intersect:

public class PayComparer : IEqualityComparer<Pay> 
{ 
    public bool Equals(Pay x, Pay y) 
    { 
     if (x == y) // same instance or both null 
      return true; 
     if (x == null || y == null) // either one is null but not both 
      return false; 

     return x.EventId == y.EventId; 
    } 


    public int GetHashCode(Pay pay) 
    { 
     return pay != null ? pay.EventId : 0; 
    } 
} 

... 

var Result = nlist.Intersect(olist, new PayComparer()); 
+2

hoặc bạn có thể viết Comparer của riêng bạn: http://msdn.microsoft.com/en-us/library/234b841s.aspx – mydogisbox

+0

@mydogisbox, vâng, tôi đã thực sự chỉnh sửa câu trả lời của tôi đề cập đến điều này khi bạn nhận xét;) –

+0

Hoặc bạn có thể làm cho 'Pay' gõ một' struct' để có nó được thực hiện cho bạn, mặc dù việc thực hiện mặc định là chậm bởi vì nó sử dụng sự phản chiếu. – Gebb

0

Intersect có lẽ chỉ thêm các đối tượng khi cùng một ví dụ của Pay là trong cả hai List. Khi oldPaynewPay được khởi tạo, chúng được coi là không bằng nhau.

Intersect sử dụng Equals phương pháp để so sánh các đối tượng. Nếu bạn không ghi đè nó, nó giữ nguyên hành vi tương tự của lớp Object: trả lại true chỉ khi cả hai đều là cùng một cá thể của đối tượng.

Bạn nên ghi đè phương thức Equals trong Pay.

//in the Pay class 
    public override bool Equals(Object o) { 
     Pay pay = o as Pay; 
     if (pay == null) return false; 
     // you haven't said if Number should be included in the comparation 
     return EventId == pay.EventId; // && Number == pay.Number; (if applies) 
    } 
0

Đối tượng là loại tham chiếu. Khi bạn tạo hai đối tượng, bạn có hai tham chiếu duy nhất. Cách duy nhất họ có thể so sánh bằng nhau là nếu bạn đã làm:

object a = new object(); 
object b = a; 

Trong trường hợp này, (a == b) là đúng. Đọc lên trên reference so với value loại và objects

Và để khắc phục vấn đề của bạn, hãy ghi đè Bằng và GetHashCode, như Thomas Levesque đã chỉ ra.

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