List Except 操作,IEqualityComparer 使用
1.此接口用於對集合 的自定義相等比較算法的實現。包含2個方法:
Equals(T,T): 確定指定的對象是否相等。 T 為要比較的對象類型;
GetHashCode(T) :返回指定對象的哈希代碼。如果兩個對象的Equal 比較結果相等,則他們hashCode返回的對象也必須返回同一個值;
2. 官方建議繼承 EqualityComparer<T> 而不是實現 IEqualityComparer<T>
3.
Union()
這個方法將會Union(並集)兩個序列(集合)連接成一個新列表(集合)
public static IEnumerable<TSource> Union<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second)
public static IEnumerable<TSource> Union<TSource>(this IEnumerable<TSource> first,IEnumerable<TSource> second, IEqualityComparer<TSource> comparer)
Intersect ()
它將產生兩個序列的交集.
方法定義是:
public static IEnumerable<TSource> Intersect<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second)
public static IEnumerable<TSource> Intersect<TSource>(this IEnumerable<TSource> first, Enumerable<TSource> second,IEqualityComparer<TSource> comparer)
Except ()
它是從一個集合中刪除存在另一個集合中的項.兩個序列產生的集合差. 英文意思是:除此之外
方法定義是:
public static IEnumerable<TSource> Except<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second)
public static IEnumerable<TSource> Except<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second, IEqualityComparer<TSource> comparer)
實例代碼分別如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; namespace test { class Program { static void Main(string[] args) { IList<Student> oneStudents = new List<Student>(); oneStudents.Add(new Student(1,false,"小新1","徐匯")); oneStudents.Add(new Student(2,false,"小新2","閔行")); oneStudents.Add(new Student(3, false, "小新3", "嘉定")); oneStudents.Add(new Student(4, false, "小新4", "閘北")); IList<Student> twoStudents = new List<Student>(); twoStudents.Add(new Student(5, false, "小新5", "貴州")); twoStudents.Add(new Student(6, false, "小新6", "湖北")); twoStudents.Add(new Student(7, false, "小新7", "山東")); twoStudents.Add(new Student(8, false, "小新8", "西藏")); IList<Student> threeStudents = new List<Student>(); threeStudents.Add(new Student(1, false, "小新1", "徐匯")); threeStudents.Add(new Student(2, false, "小新2", "閔行")); var bingji = oneStudents.Union(twoStudents, new StudentListEquality()).ToList();//並(全)集 var jiaoji = oneStudents.Intersect(threeStudents, new StudentListEquality()).ToList();//交集 var chaji = oneStudents.Except(threeStudents, new StudentListEquality()).ToList();//差集 Console.WriteLine(); Console.WriteLine("以下是並集的結果"); bingji.ForEach(x => { Console.WriteLine(x.StudentId.ToString() + " " + x.Sex.ToString() + " " + x.Name.ToString()+" "+x.Address.ToString()); }); Console.WriteLine(); Console.WriteLine("以下是交集的結果"); jiaoji.ForEach(x => { Console.WriteLine(x.StudentId.ToString() + " " + x.Sex.ToString() + " " + x.Name.ToString() + " " + x.Address.ToString()); }); Console.WriteLine(); Console.WriteLine("以下是差集的結果"); chaji.ForEach(x => { Console.WriteLine(x.StudentId.ToString() + " " + x.Sex.ToString() + " " + x.Name.ToString() + " " + x.Address.ToString()); }); } } public class Student { public Student(int studentId, bool sex, String name, String address) { this.StudentId = studentId; this.Sex = sex; this.Name = name; this.Address = address; } public int StudentId { get; set; } public bool Sex { get; set; } public String Name { get; set; } public String Address { get; set; } } public class StudentListEquality : IEqualityComparer<Student> { public bool Equals(Student x, Student y) { return x.StudentId == y.StudentId; } public int GetHashCode(Student obj) { if (obj == null) { return 0; } else { return obj.ToString().GetHashCode(); } } } }
List Except 操作,IEqualityComparer 使用