C#使用LINQ检查列表中是否存在属性值相同的对象
实现方案
完全可以用LINQ优化你的原有代码,相比O(n²)时间复杂度的嵌套循环,LINQ方案的时间复杂度可降低至O(n),执行效率更高,代码可读性也更好。
你可以根据需求选择以下两种常用实现:
1. 简洁分组写法
通过GroupBy按Elevation属性分组,直接判断是否存在元素数≥2的分组即可:
bool hasDuplicateElevation = listOflevels .GroupBy(level => level.Elevation) .Any(group => group.Count() >= 2);
如果需要严格对齐你原有逻辑中Name不同才判定为重复的规则,可以调整为:
bool hasDuplicateElevation = listOflevels .GroupBy(level => level.Elevation) .Any(group => group.Select(l => l.Name).Distinct().Count() >= 2);
2. 更高性能的HashSet写法
如果列表数据量较大,推荐使用HashSet实现,遍历过程中遇到第一个重复值就会直接返回结果,无需遍历全量数据,性能最优:
var elevationSet = new HashSet<double>(); bool hasDuplicateElevation = listOflevels.Any(level => !elevationSet.Add(level.Elevation));
注意:
double为浮点数类型,直接比较相等可能存在精度误差,如果Elevation是计算生成的数值,建议先做精度对齐(比如通过Math.Round(level.Elevation, 保留小数位数)处理)再进行重复判断,避免业务误判。
原有代码问题说明
你当前的嵌套循环写法存在两个可优化点:
- 时间复杂度为O(n²),列表元素越多性能下降越明显
- 同一对重复对象会被重复判断两次,存在无效计算
内容的提问来源于stack exchange,提问作者Rodrigo Matos
相关产品推荐
相关产品推荐

