C# foreach列表过滤代码转LINQ后出现重复条目问题求助
C# foreach逻辑转LINQ出现重复条目问题解决方案
问题原因
- 你写的LINQ中
!filteredlist.Contains(newitem)条件失效:LINQ查询为延迟执行,执行ToList()触发查询前,你刚初始化的filteredlist为空集合,该条件永远返回true,完全没有去重作用。 - 三重
from生成笛卡尔积:当同一个newitem匹配到list中多个ApplicationKey时,会返回多条完全相同的newitem记录,最终结果自然出现大量重复。
正确实现方案
推荐优化写法,用Any替代遍历assulkeylist避免笛卡尔积,性能更高也更符合原始逻辑:
List<ListItem> filteredlist = lists // 过滤Items为空的外层项 .Where(item => item.Items.Count > 0) // 展开所有内层newitem .SelectMany(item => item.Items) // 匹配Href包含任意一个ApplicationKey的项 .Where(newitem => list.Any(assulkeylist => newitem.Href.Contains(assulkeylist.ApplicationKey))) // 去重(如果ListItem是引用类型,默认比较引用,需要自定义相等逻辑看下方说明) .Distinct() .ToList();
自定义去重规则说明
如果你用的是.NET 6及以上版本,可以直接用DistinctBy按属性去重,不需要重写类的相等方法:
// 示例按ListItem的Id属性去重,替换为你实际判断唯一性的属性即可 var filteredlist = lists .Where(item => item.Items.Count > 0) .SelectMany(item => item.Items) .Where(newitem => list.Any(assulkeylist => newitem.Href.Contains(assulkeylist.ApplicationKey))) .DistinctBy(item => item.Id) .ToList();
如果是低版本.NET,要么重写ListItem的Equals和GetHashCode方法,要么自己实现自定义的IEqualityComparer<ListItem>传入Distinct方法即可。
内容的提问来源于stack exchange,提问作者MAG MS Programmer
相关产品推荐
相关产品推荐

