c#提供了Intersect來得到兩個列表的交集,它是通過使用默認的相等比較器對值進行比較生成兩個序列的交集,定義為:
public static IEnumerable<TSource> Intersect<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second);
我們使用它來比較兩個列表試試:
List<double> oneList = new List<double> { 9, 8, 5, 3 }; List<double> twoList = new List<double> { 9, 3 }; List<double> result = oneList.Intersect(twoList).ToList();
結果是{9,3}
我們再來試試對象列表
我們先定義一個模型
public class TarGetValueList { public double TargetValue { get; set; } }
然后求交集
List<TarGetValueList> ListOne = new List<TarGetValueList>(); List<TarGetValueList> ListTwo= new List<TarGetValueList>(); //第一個列表增加的對象 TarGetValueList Night = new TarGetValueList() { TargetValue = 9.0 }; TarGetValueList Sex = new TarGetValueList() { TargetValue = 6.0 }; TarGetValueList Seven = new TarGetValueList() { TargetValue = 7.0 }; TarGetValueList Five = new TarGetValueList() { TargetValue = 5.0 }; //第二個列表增加的對象 TarGetValueList Three = new TarGetValueList() { TargetValue = 3.0 };//第一個列表增加對象 ListOne.Add(Night); ListOne.Add(Sex); ListOne.Add(Five); ListOne.Add(Seven);//9 6 5 7 //第二個列表增加對象 ListTwo.Add(Five); ListTwo.Add(Three); //5 3 List<TarGetValueList> resultList = ListTwo.Intersect(ListOne).ToList();
第一個列表是{9,6,5,7},第二個列表是{5,3},結果交集是{5},結果在預想之內,至今為止,一切都很順利。我們似乎已經掌握了用c#來求兩個列表的交集,但讓我們在以上的例子上進行以下的嘗試:
List<TarGetValueList> ListOne = new List<TarGetValueList>(); List<TarGetValueList> ListTwo= new List<TarGetValueList>(); //第一個列表增加的對象 TarGetValueList Night = new TarGetValueList() { TargetValue = 9.0 }; TarGetValueList Sex = new TarGetValueList() { TargetValue = 6.0 }; TarGetValueList Seven = new TarGetValueList() { TargetValue = 7.0 }; TarGetValueList Five = new TarGetValueList() { TargetValue = 5.0 }; //第二個列表增加的對象 TarGetValueList Three = new TarGetValueList() { TargetValue = 3.0 }; TarGetValueList FiveTwo = new TarGetValueList() { TargetValue = 5.0 }; //第一個列表增加對象 ListOne.Add(Night); ListOne.Add(Sex); ListOne.Add(Five); ListOne.Add(Seven);//9 6 5 7 //第二個列表增加對象 ListTwo.Add(FiveTwo); ListTwo.Add(Three); //5 3 List<TarGetValueList> resultList = ListTwo.Intersect(ListOne).ToList();
第一個列表仍然是{9,6,5,7},第二個列表仍然是{5,3},得到的結果交集列表卻為空了。第二個列表的5跟第一個列表的5來自不同的對象,不過對象里的值都是一樣的。但Intersect函數判斷它們不是交集對象,這是因為判斷對象是否相等是根據它們的內存地址來判斷,那我們判斷對象之間相等就沒辦法了嗎?我們重寫IEqualityComparer即可:
public class TarGetComparer : IEqualityComparer<TarGetValueList> { public bool Equals(TarGetValueList x, TarGetValueList y) { try { return x.TargetValue == y.TargetValue; } catch(Exception ex) { return base.Equals(x); } } public int GetHashCode(TarGetValueList obj) { return obj.TargetValue.GetHashCode(); } }
List<TarGetValueList> ListOne = new List<TarGetValueList>(); List<TarGetValueList> ListTwo= new List<TarGetValueList>(); //第一個列表增加的對象 TarGetValueList Night = new TarGetValueList() { TargetValue = 9.0 }; TarGetValueList Sex = new TarGetValueList() { TargetValue = 6.0 }; TarGetValueList Seven = new TarGetValueList() { TargetValue = 7.0 }; TarGetValueList Five = new TarGetValueList() { TargetValue = 5.0 }; //第二個列表增加的對象 TarGetValueList Three = new TarGetValueList() { TargetValue = 3.0 }; TarGetValueList FiveTwo = new TarGetValueList() { TargetValue = 5.0 }; //第一個列表增加對象 ListOne.Add(Night); ListOne.Add(Sex); ListOne.Add(Five); ListOne.Add(Seven);//9 6 5 7 //第二個列表增加對象 ListTwo.Add(FiveTwo); ListTwo.Add(Three); //5 3 List<TarGetValueList> resultList = ListTwo.Intersect(ListOne,new TarGetComparer()).ToList();
這樣就得出了我們預期的結果{5}