2011-11-29 9 views
10
나는 두 목록은 아래를 참조했다

는 ..... 결과는 왜 어떤 단서교차 둘 사이의 목록이 작동하지

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); 

가 비어 돌아오고있다?

+0

성별 임금 평등이 EventID, Number 및 Amount로 가정하면 두 목록에는 공통점이 없으므로 아무 것도 교차하지 않습니다. 즉, 여기서 평등을 정의하지 않았습니다. –

+0

여기에 평등을 정의하지 않았다는 것은 무엇을 의미합니까? Amount = 100 – user570715

+0

상태에 'oldpay'가 'newpay'와 같아야한다는 질문에는 아무 것도 없습니다. –

답변

21

당신은 2 개 인스턴스가 동일한 것으로 간주 할 때, 그렇지 않으면 Intersect 모르는, 당신의 Pay 클래스의 EqualsGetHashCode 메소드를 오버라이드 (override) 할 필요가있다. 평등을 결정하는 것이 EventId이라고 어떻게 추측 할 수 있습니까? oldPaynewPay은 서로 다른 인스턴스이므로 기본적으로 동일한 것으로 간주되지 않습니다.

이 같은 Pay의 메소드를 오버라이드 (override) 할 수 있습니다

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

또는 자신의 비교자를 작성할 수 있습니다. http://msdn.microsoft.com/en-us/library/234b841s.aspx – mydogisbox

+0

@mydogisbox 예, 주석을 달았을 때 내 대답을 실제로 편집했습니다.) –

+0

또는 당신은'Pay' 타입을'struct'로 만들 수 있습니다. 기본 구현은 리플렉션을 사용하기 때문에 느리다. – Gebb

0

Intersect 아마에만 추가 개체입니다 :

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; 
} 

또 다른 옵션은 IEqualityComparer<Pay>를 구현하고 Intersect에 매개 변수로 전달하는 것입니다 Pay의 동일한 인스턴스가 모두 List에있는 경우 oldPaynewPay은 인스턴스화되어 떨어져 있기 때문에 동일하지 않은 것으로 간주됩니다.

IntersectEquals 메서드를 사용하여 개체를 비교합니다. 재정의하지 않으면 Object 클래스의 동일한 동작을 유지합니다. 둘 다 객체의 동일한 인스턴스 인 경우에만 true을 반환합니다.

Equals 메서드를 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

개체는 참조 유형입니다. 두 개의 객체를 만들 때 두 개의 고유 한 참조가 있습니다. 그들이 평등하다고 비교할 수있는 유일한 방법은 다음과 같습니다.

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

이 경우 (a == b)는 참입니다. referencevalue 대 유형에 최대 읽기 및

objects 그리고 당신의 문제를 해결하기 위해, 재정의 같음과 GetHashCode는 토마스 레베는 지적했다.

관련 문제