前言
如標題所述,在ASP.NET應用程式開發中,兩個集合做比較時 我們使用微軟IEnumerable封裝的 Except/Intersect/Union 取 差集/交集/并集 方法是非常的方便的;
但以上對于不太熟悉的小伙伴來講,在遇到求包含參考型別(不包含string)集合時就非常的苦惱;
下面我將帶著大家去了解如何通過微軟自帶方法方式去取**復雜型別集合**的差集、交集、并集,
場景
這里是場景,我有以下兩個學生集合,
namespace Test2 { internal class Program { public void Main() { //串列1 List<Student> StudentList1 = new List<Student>() { new Student {Id=1,Name="小明",Age=27 }, new Student {Id=3,Name="大郭",Age=28 }, new Student {Id=4,Name="老登",Age=29 } }; List<Student> StudentList2 = new List<Student>() { new Student {Id=1,Name="小明",Age=27 }, new Student {Id=3,Name="大郭",Age=28 }, new Student {Id=4,Name="老登",Age=29 }, new Student {Id=4,Name="小路",Age=28 }, new Student {Id=4,Name="小明",Age=30 } }; } } }
生成兩個物體集合;
下面我們取交集/差集/并集
完整呼叫示例(.NET Core):
namespace Test2 { internal class Program { public static void Main() { //串列1 List<Student> StudentList1 = new List<Student>() { new Student {Id=1,Name="小明",Age=27 }, new Student {Id=2,Name="大郭",Age=28 }, new Student {Id=3,Name="老登",Age=29 } }; //串列2 List<Student> StudentList2 = new List<Student>() { new Student {Id=1,Name="小明",Age=27 }, new Student {Id=2,Name="大郭",Age=28 }, new Student {Id=3,Name="老登",Age=29 }, new Student {Id=4,Name="小路",Age=28 }, new Student {Id=5,Name="小明",Age=30 } }; //取比串列1里多出來的學生資料 并輸出 var ExceptData =https://www.cnblogs.com/wslpf/p/ StudentList2.Except(StudentList1); Console.WriteLine("差集:" + String.Join(";", ExceptData.Select(x => { return $"{x.Id}-{x.Name}-{x.Age}"; }))); //取串列1與串列2里共有的學生資料 var IntersectData =https://www.cnblogs.com/wslpf/p/ StudentList1.Intersect(StudentList2); Console.WriteLine("交集:" + String.Join(";", IntersectData.Select(x => { return $"{x.Id}-{x.Name}-{x.Age}"; }))); //獲取辦理所有學生的資料(一個相同的學生只能一條) var UnionData =https://www.cnblogs.com/wslpf/p/ StudentList1.Union(StudentList2); Console.WriteLine("并集:"+String.Join(";", UnionData.Select(x => { return $"{x.Id}-{x.Name}-{x.Age}"; }))); } } }
輸出:
差集:1-小明-27;2-大郭-28;3-老登-29;4-小路-28;5-小明-30
交集:null
并集:1-小明-27;2-大郭-28;3-老登-29;1-小明-27;2-大郭-28;3-老登-29;4-小路-28;5-小明-30
以上輸出仔細看一下明顯是不對的,這就涉及到了復雜型別對比,請看代碼:
正常我們宣告的類
/// <summary> /// 學生類 /// </summary> internal class Student { /// <summary> /// 編號 /// </summary> public int Id { get; set; } /// <summary> /// 姓名 /// </summary> public string Name { get; set; } /// <summary> /// 年齡 /// </summary> public int Age { get; set; } }
因為我們要對比的是參考型別,因為在對比除string參考型別外,其他參考型別的對比默認都是對比的堆里地址,所以我們要實作一個自定義的對比方案
我們需要繼承一個介面 IEqualityComparer<T> 泛型介面
如下:(這里我們以年齡與名做為對比條件)
/// <summary> /// 學生類 /// </summary> internal class Student : IEqualityComparer<Student> { /// <summary> /// 編號 /// </summary> public int Id { get; set; } /// <summary> /// 姓名 /// </summary> public string Name { get; set; } /// <summary> /// 年齡 /// </summary> public int Age { get; set; } /// <summary> /// 比較器 /// </summary> /// <param name="s1">比較物體1</param> /// <param name="s2">比較物體2</param> /// <returns></returns> public bool Equals(Student s1, Student s2) { //驗證相等條件 if (s1.Name == s2.Name && s1.Age == s2.Age) { return true; } return false; } /// <summary> /// 獲取唯一條件 /// </summary> /// <param name="stu"></param> /// <returns></returns> public int GetHashCode(Student stu) { return (stu.Name + "|" + stu.Age).GetHashCode(); } }
修改了類后還有最重要的一點:就是修改比較的方法(相當于宣告一個自定義的比較器給方法)
//取比串列1里多出來的學生資料 并輸出 var ExceptData =https://www.cnblogs.com/wslpf/p/ StudentList2.Except(StudentList1,new Student()); Console.WriteLine("差集:" + String.Join(";", ExceptData.Select(x => { return $"{x.Id}-{x.Name}-{x.Age}"; }))); //取串列1與串列2里共有的學生資料 var IntersectData =https://www.cnblogs.com/wslpf/p/ StudentList1.Intersect(StudentList2,new Student()); Console.WriteLine("交集:" + String.Join(";", IntersectData.Select(x => { return $"{x.Id}-{x.Name}-{x.Age}"; }))); //獲取辦理所有學生的資料(一個相同的學生只能一條) var UnionData =https://www.cnblogs.com/wslpf/p/ StudentList1.Union(StudentList2,new Student()); Console.WriteLine("并集:"+String.Join(";", UnionData.Select(x => { return $"{x.Id}-{x.Name}-{x.Age}"; })));
輸出:
差集:4-小路-28;5-小明-30
交集:1-小明-27;2-大郭-28;3-老登-29
并集:1-小明-27;2-大郭-28;3-老登-29;4-小路-28;5-小明-30
到這里參考型別的比較已經完成了,比較器的條件方法可以根據需求調整,如有不足之處,希望大家多多指正!!!
只有努力把自己變得更優秀,才能更好的生活
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/500482.html
標籤:ASP.NET
