2016-07-05 21 views
0

如何從兩個對象列表中找到所有實現IComparable的交集對象?C# - IComparable對象列表之間的交集

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

那麼,你有沒有嘗試過什麼了嗎?一個相當簡單的選擇是創建一個'IEqualityComparer',它使用'CompareTo'來檢查相等性,然後使用LINQ的'Intersect'方法... –

回答

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 進行比較。 –