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();
代码细节解释
- GroupBy(p => p.Point3d):以Point3d为键分组,确保所有坐标相同的对象都在同一个组里。
- Where(...):通过
Distinct()获取组内唯一的Tag值,若数量大于1,说明该组存在Tag不同的对象,符合筛选要求。 - 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
相关产品推荐
相关产品推荐

