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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 19:57:02