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

Linq GroupBy返回原对象:筛选Point3d同Tag不同的pmatch对象求助

嘿,这个需求用Linq的GroupBy配合几个简单操作就能轻松实现,而且完全能保留原对象,我给你捋清楚步骤和代码:

解决方法:筛选Point3d相同但Tag不同的pmatch对象

核心思路

  • 先按Point3d属性对所有pmatch对象分组
  • 筛选出组内包含至少两种不同Tag值的分组
  • 最后把这些符合条件的分组里的所有原对象扁平化为一个集合

代码实现

假设你的pmatch对象集合名为pmatchList,直接用这段Linq查询即可:

var targetMatches = pmatchList
    .GroupBy(p => p.Point3d) // 按Point3d分组,把同坐标的对象归为一组
    .Where(group => group.Select(p => p.Tag).Distinct().Count() > 1) // 筛选组内Tag不唯一的分组
    .SelectMany(group => group) // 拆解分组,返回所有符合条件的原对象
    .ToList();

代码细节解释

  1. GroupBy(p => p.Point3d):以Point3d为键分组,确保所有坐标相同的对象都在同一个组里。
  2. Where(...):通过Distinct()获取组内唯一的Tag值,若数量大于1,说明该组存在Tag不同的对象,符合筛选要求。
  3. SelectMany(group => group):将分组中的原对象全部提取出来,最终得到的是pmatch对象的集合,而不是分组结构。

性能优化(可选)

如果你的集合数据量很大,上面的Distinct().Count()需要遍历整个分组统计数量,可以换成更高效的提前终止判断:

var targetMatches = pmatchList
    .GroupBy(p => p.Point3d)
    .Where(group => 
    {
        var firstTag = group.First().Tag;
        return group.Any(p => p.Tag != firstTag);
    })
    .SelectMany(group => group)
    .ToList();

这个版本只要找到第一个和组内首个Tag不同的对象就会停止检查,能节省不必要的遍历开销。

内容的提问来源于stack exchange,提问作者Treefingers

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:35:39