.NET环境下如何用LINQ按规则过滤List<SearchResult>并去重
解决方案
你原有代码的问题是仅按CompanyId分组,会把同一企业下所有不同联系人的条目都合并到同一个分组,仅返回第一条,导致结果缺失。
实现逻辑
- 首先过滤掉所有
CompanyId为null的非法条目 - 以
CompanyId+ContactId的组合作为去重键,两种合法的唯一标识都会被正确识别:
- 同时存在
CompanyId和ContactId的条目按组合值去重 - 仅存在
CompanyId的条目自动按单独企业ID去重
代码实现
.NET 6及以上版本(推荐)
直接使用内置的DistinctBy方法,代码更简洁:
var result = searchResults // 过滤CompanyId为null的非法条目 .Where(sr => sr.CompanyId.HasValue) // 按两个字段的组合去重 .DistinctBy(sr => new { sr.CompanyId, sr.ContactId }) .ToList();
兼容低版本.NET框架
使用GroupBy实现同等逻辑:
var result = searchResults .Where(sr => sr.CompanyId.HasValue) .GroupBy(sr => new { sr.CompanyId, sr.ContactId }) .Select(grp => grp.First()) .ToList();
运行结果
执行后输出的结果与你期望的一致:
1 1 2 3 2 4 1 2
内容的提问来源于stack exchange,提问作者Bender.
相关产品推荐
相关产品推荐

