如何使用C# LINQ筛选出List2中name存在于List1的元素?
如何用C# LINQ筛选出List2中与List1匹配的元素?
问题描述
给定两个列表:
- List1:字符串列表
{"test1", "test2","test3"} - List2:自定义对象列表(对象包含
name和value属性),元素为{"name": "test1", "value":1},{"name": "test2", "value":2},{"name": "test5", "value":5}
需要得到List3,仅保留List2中name存在于List1里的元素,结果为:{"name": "test1", "value":1},{"name": "test2", "value":2}
实现方案
首先定义对应的数据类(假设List2的元素类型为Item):
public class Item { public string name { get; set; } public int value { get; set; } }
方法1:使用Where + HashSet(大列表场景性能更优)
先把List1转为HashSet降低查找复杂度,再用Where过滤List2:
// 初始化输入列表 List<string> list1 = new List<string> { "test1", "test2", "test3" }; List<Item> list2 = new List<Item> { new Item { name = "test1", value = 1 }, new Item { name = "test2", value = 2 }, new Item { name = "test5", value = 5 } }; // 转换为HashSet,将单元素查找复杂度从O(n)降为O(1) HashSet<string> nameHashSet = new HashSet<string>(list1); // 筛选匹配元素 List<Item> list3 = list2.Where(item => nameHashSet.Contains(item.name)).ToList();
方法2:使用Join(LINQ原生关联操作)
利用Join直接关联两个列表,匹配后返回List2的元素:
List<Item> list3 = list2.Join( list1, item => item.name, // List2的关联键 name => name, // List1的关联键 (item, _) => item // 匹配后返回List2的元素 ).ToList();
说明
- 如果List1元素数量较多,优先选择以上两种方法,两者内部都用哈希表优化,时间复杂度为O(n+m);若直接使用
list2.Where(item => list1.Contains(item.name)),时间复杂度会达到O(n*m),大列表场景性能差异明显。 - 两种方法最终得到的List3结果一致,可根据代码可读性偏好选择。
内容的提问来源于stack exchange,提问作者sanil mendonca
相关产品推荐
相关产品推荐

