如何使用LINQ筛选两个列表中名称匹配的对象并返回指定属性
正确实现方案
错误原因说明
- 第一次使用
All方法逻辑错误:All要求persons列表中所有对象的Name都和当前匹配项的Name相等,除非persons列表只有一个元素且完全匹配,否则必然返回空结果。 - 第二次
Contains方法参数类型不匹配:persons是Person类型的集合,无法直接匹配字符串类型的x.Name,所以抛出类型转换错误。
推荐实现方式
首先优先提取persons的Name为哈希集合,匹配效率更高,尤其适合数据量较大的场景:
// 提取待匹配姓名集合,添加StringComparer.OrdinalIgnoreCase可实现大小写不敏感匹配(适配james/James的场景) HashSet<string> matchNames = persons.Select(p => p.Name).ToHashSet(StringComparer.OrdinalIgnoreCase); // 执行LINQ查询,返回仅包含Name和Country的结果集 var result = MyListOfObjects .Where(obj => matchNames.Contains(obj.Name)) .Select(obj => new { obj.Name, obj.Country }) .ToList();
小数据量简易写法
如果数据量很小,也可以直接用Any方法实现,无需提前提取集合:
var result = MyListOfObjects .Where(obj => persons.Any(p => p.Name.Equals(obj.Name, StringComparison.OrdinalIgnoreCase))) .Select(obj => new { obj.Name, obj.Country }) .ToList();
补充注意事项
你提供的persons初始化语法存在错误,正确的对象集合初始化写法如下:
private static IEnumerable<Person> persons = new[] { new Person { Name = "James" }, new Person { Name = "Jimmy" } };
内容的提问来源于stack exchange,提问作者Nightwher Nightwher
相关产品推荐
相关产品推荐

