問題引入:?
Teacher實體的唯一標識符是Name和Classes字段(或者說這兩個字段唯一確定一條數據),如何對兩個實體列表做交集、差集運算呢?(并集直接調用AddRange方法即可)
一、重寫方法實現
1.原理
????????重寫 Equals() 和 GetHashCode() 方法,使用Intersect() 和 Except() 方法在比較時就會基于這些字段來判斷對象是否相等
2.快速生成代碼
3.代碼
public class Teacher
{public int Id { get; set; }public string Name { get; set; }public string Classes { get; set; }public override bool Equals(object obj){return obj is Teacher teacher &&Name == teacher.Name &&Classes == teacher.Classes;}public override int GetHashCode(){return HashCode.Combine(Name, Classes);}
}class Program
{static void Main(){// 創建兩個示例列表List<Teacher> listA = new List<Teacher>{new Teacher { Id = 1, Name = "Alice", Classes = "Math" },new Teacher { Id = 2, Name = "Bob", Classes = "Science" },new Teacher { Id = 3, Name = "Charlie", Classes = "English" }};List<Teacher> listB = new List<Teacher>{new Teacher { Id = 2, Name = "Bob", Classes = "Science" },new Teacher { Id = 3, Name = "Charlie", Classes = "English" },new Teacher { Id = 4, Name = "David", Classes = "History" }};// 求交集var intersection = listA.Intersect(listB).ToList();// 求差集 A - Bvar difference = listA.Except(listB).ToList();// 輸出結果Console.WriteLine("交集:");foreach (var teacher in intersection){Console.WriteLine($"Id: {teacher.Id}, Name: {teacher.Name}, Classes: {teacher.Classes}");}Console.WriteLine("\n差集 A - B:");foreach (var teacher in difference){Console.WriteLine($"Id: {teacher.Id}, Name: {teacher.Name}, Classes: {teacher.Classes}");}}
}
二、嵌套查詢實現
1.原理
var intersection = listA.Where(a => listB.Any(b => b.Name == a.Name && b.Classes == a.Classes)).ToList();
var difference = listA.Where(a => !listB.Any(b => b.Name == a.Name && b.Classes == a.Classes)).ToList();
????????where-Any相當于A表內連接B表( A ∩ B );
????????where-!Any相當于A表左外連接B表并剔除匹配到的數據(A - B)。
2.代碼
public class Teacher
{public int Id { get; set; }public string Name { get; set; }public string Classes { get; set; }
}class Program
{static void Main(){// 創建兩個示例列表List<Teacher> listA = new List<Teacher>{new Teacher { Id = 1, Name = "Alice", Classes = "Math" },new Teacher { Id = 2, Name = "Bob", Classes = "Science" },new Teacher { Id = 3, Name = "Charlie", Classes = "English" }};List<Teacher> listB = new List<Teacher>{new Teacher { Id = 2, Name = "Bob", Classes = "Science" },new Teacher { Id = 3, Name = "Charlie", Classes = "English" },new Teacher { Id = 4, Name = "David", Classes = "History" }};// 自定義方法來比較 Name 和 Classesvar intersection = listA.Where(a => listB.Any(b => b.Name == a.Name && b.Classes == a.Classes)).ToList();var difference = listA.Where(a => !listB.Any(b => b.Name == a.Name && b.Classes == a.Classes)).ToList();// 輸出交集Console.WriteLine("交集:");foreach (var teacher in intersection){Console.WriteLine($"Id: {teacher.Id}, Name: {teacher.Name}, Classes: {teacher.Classes}");}// 輸出差集Console.WriteLine("\n差集 A - B:");foreach (var teacher in difference){Console.WriteLine($"Id: {teacher.Id}, Name: {teacher.Name}, Classes: {teacher.Classes}");}}
}