You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# 如何正确筛选按Location分组后同组内存在重复ID的数据集

问题分析与修正方案

逻辑错误点

你的现有代码存在两处核心逻辑偏差:

  1. 首次按Location分组后的过滤规则错误:w => w.Select(s => s.Location).Count() > 1仅判断当前Location下的条目总数大于1,完全没有校验该分组内是否存在重复ID。
  2. 打平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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 00:39:01