2016-07-05 2 views
0

IComparable을 모두 구현하는 두 개체 목록에서 교차 개체를 찾는 방법은 무엇입니까? 이 같은IComparable 개체 목록 사이의 교차점

public List<T> Intersect<T>(List<T> list1, List<T> list2) where T : IComparable<T> { 
    return ... ; 
} 
+5

글쎄, 당신은 아직 아무것도 시도? 꽤 간단한 옵션은 'CompareTo'를 사용하여 평등을 검사 한 다음 'LINQ의'Intersect' 메서드를 사용하는'IEqualityComparer'를 만드는 것입니다 ... –

답변

1

뭔가

public List<T> Intersetc<T>(List<T> list1, List<T> list2) where T : IComparable<T> 
{ 
    return list1.Intersect(list2, new MyEqualityComparer<T>()).ToList(); 
} 

public class MyEqualityComparer<T> : IEqualityComparer<T> where T : IComparable<T> 
{ 
    public bool Equals(T t1, T t2) 
    { 
     return t1.CompareTo(t2) == 0; 
    } 

    public int GetHashCode(T t) 
    { 
     return 0; 
    } 
} 
+0

'GetHashCode'가 다른 값을 반환하고 여전히'CompareTo' 0 –

+0

를 반환합니다. 맞습니다. 답변을 업데이트했습니다. –

+0

필자가 말한 것은 't1.CompareTo (t2) == 0'이지만 'MyEqualityComparer .GetHashCode()'가 다른 값을 반환하기 때문에'MyEqualityComparer .Equals'가 호출되지 않는 경우입니다. –

1

이유는 단순히 :

public List<T> Intersect<T>(List<T> list1, List<T> list2) where T : IComparable<T> 
    { 
     var intersect = list1.Intersect(list2); 
     return intersect.ToList(); 
    } 
+0

비교를 위해 IComparable 을 사용하지 않습니다. –