C# 如何正确筛选按Location分组后同组内存在重复ID的数据集
问题分析与修正方案
逻辑错误点
你的现有代码存在两处核心逻辑偏差:
- 首次按Location分组后的过滤规则错误:
w => w.Select(s => s.Location).Count() > 1仅判断当前Location下的条目总数大于1,完全没有校验该分组内是否存在重复ID。 - 打平Location分组后做了全局ID去重统计:只要某个ID在全表范围内重复出现,就会将该ID对应的所有条目全部返回。ID=5在LocationC有2条、LocationD有1条,全局计数为3满足重复条件,因此LocationD的单条ID=5记录也被误返回。
修正代码
根据你给出的预期结果(仅保留各Location分组内重复ID对应的条目),修正后代码如下:
var query1 = list // 过滤Name为空的条目 .Where(s => !string.IsNullOrEmpty(s.Name)) // 按Location分组 .GroupBy(g => g.Location) // 对每个Location分组单独处理,仅保留该分组内重复ID对应的记录 .SelectMany(locationGroup => locationGroup.GroupBy(item => item.id) .Where(idGroup => idGroup.Count() > 1) .SelectMany(idGroup => idGroup) ) .ToList();
运行后输出和你的预期完全一致。
拓展场景
如果你的需求是只要Location分组内存在重复ID,就返回该分组下的所有条目(包含分组内ID不重复的记录),可以使用以下代码,此时返回结果会额外包含LocationB下ID=1、ID=2的两条记录:
var query1 = list .Where(s => !string.IsNullOrEmpty(s.Name)) .GroupBy(g => g.Location) .Where(locationGroup => locationGroup.GroupBy(item => item.id).Any(g => g.Count() > 1)) .SelectMany(g => g) .ToList();
内容的提问来源于stack exchange,提问作者Syntax_MM
相关产品推荐
相关产品推荐

