C# 两个list,查询属性相等的数据

C# 两个list,查询属性相等的数据
目录方法一使用 HashSet Where推荐性能最优方法二使用 Join适合需要获取双方数据方法三使用 Intersect仅适用于简单类型或重写 Equals 的自定义类总结建议如果您喜欢此文章请收藏、点赞、评论谢谢祝您快乐每一天。在 C# 中查询两个 List 中某个属性值相等的数据即求交集最高效且常用的方法是使用HashSet配合 LINQ或者直接使用 LINQ 的Join和Intersect方法。以下是几种常见场景的实现方式方法一使用 HashSet Where推荐性能最优适用于数据量较大场景。先将其中一个列表的关键属性提取到HashSet中利用其 O(1) 的查找效率进行过滤。using System;using System.Collections.Generic;using System.Linq;public class Program{public class Item{public int Id { get; set; }public string Name { get; set; }public override string ToString() $Id: {Id}, Name: {Name};}public static void Main(){var listA new ListItem{new Item { Id 1, Name Apple },new Item { Id 2, Name Banana },new Item { Id 3, Name Cherry }};var listB new ListItem{new Item { Id 2, Name Banana },new Item { Id 4, Name Date },new Item { Id 5, Name Elderberry }};// 1. 将 ListB 的 Id 放入 HashSet提高查找效率var bIds new HashSetint(listB.Select(b b.Id));// 2. 查询 ListA 中 Id 存在于 HashSet 中的元素var commonItems listA.Where(a bIds.Contains(a.Id)).ToList();Console.WriteLine(属性(Id)相等的数据);foreach (var item in commonItems){Console.WriteLine(item);}}}代码说明1. 使用 Select 提取 ListB 的 Id 并构建 HashSet将查找复杂度降为 O(1)。2. 使用 Where 遍历 ListA通过 Contains 快速判断是否存在匹配项。3. 此方法比嵌套循环或多次调用 Any/Contains 性能更高适合大数据量。方法二使用 Join适合需要获取双方数据如果你不仅需要 ListA 中的数据还需要同时获取 ListB 中匹配的数据或者进行更复杂的投影使用Join是最直观的方式。using System;using System.Collections.Generic;using System.Linq;public class Program{public class Item{public int Id { get; set; }public string Name { get; set; }public override string ToString() $Id: {Id}, Name: {Name};}public static void Main(){var listA new ListItem{new Item { Id 1, Name Apple },new Item { Id 2, Name Banana },new Item { Id 3, Name Cherry }};var listB new ListItem{new Item { Id 2, Name Banana },new Item { Id 4, Name Date }};// 使用 Join 基于 Id 关联两个列表var result from a in listAjoin b in listB on a.Id equals b.Idselect new{ItemA a,ItemB b};Console.WriteLine(Join 查询结果);foreach (var pair in result){Console.WriteLine($A: {pair.ItemA}, B: {pair.ItemB});}}}代码说明1. 使用 LINQ 查询语法或方法语法的 Join 操作基于指定属性Id进行内连接。2. 可以灵活选择返回 ListA 的对象、ListB 的对象或两者的组合。3. 底层实现通常也是基于哈希表性能良好。方法三使用 Intersect仅适用于简单类型或重写 Equals 的自定义类如果列表元素是基本类型如int,string或者自定义类重写了Equals和GetHashCode可以直接使用Intersect。using System;using System.Collections.Generic;using System.Linq;public class Program{// 自定义类需重写 Equals 和 GetHashCode 才能正确使用 Intersectpublic class Item : IEquatableItem{public int Id { get; set; }public string Name { get; set; }public bool Equals(Item other){if (other is null) return false;return Id other.Id;}public override bool Equals(object obj) Equals(obj as Item);public override int GetHashCode() Id.GetHashCode();public override string ToString() $Id: {Id}, Name: {Name};}public static void Main(){var listA new ListItem{new Item { Id 1, Name Apple },new Item { Id 2, Name Banana }};var listB new ListItem{new Item { Id 2, Name Banana },new Item { Id 3, Name Cherry }};// 直接求交集var common listA.Intersect(listB).ToList();Console.WriteLine(Intersect 结果);foreach (var item in common){Console.WriteLine(item);}}}代码说明1. Intersect 默认使用对象的 Equals 方法比较。2. 对于自定义类必须重写 Equals 和 GetHashCode否则默认比较引用地址导致无法正确找到逻辑上相等的对象。3. 此方法简洁但前提条件较多不如前两种方法通用。总结建议‌高性能通用方案‌使用 ‌方法一HashSet Where‌代码清晰且性能稳定。‌需要双向数据‌使用 ‌方法二Join‌。‌简单类型或已重写 Equals‌使用 ‌方法三Intersect‌。如果您喜欢此文章请收藏、点赞、评论谢谢祝您快乐每一天。