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

如何使用Linq替代嵌套循环对比列表并拆分至匹配/不匹配列表?

使用LINQ简化列表匹配逻辑

当然可以用LINQ简化这段嵌套循环的逻辑,还能优化查找效率,下面给出两种实现方式:

基础实现(直接用LINQ的Any方法)

先把ResultList转换为便于比较的强类型集合,再通过Where筛选匹配项:

// 先把dynamic类型的ResultList转成强类型的键集合,避免重复类型转换
var resultKeys = ResultList.Select(r => new 
{ 
    OuterID = (int)r.OuterID, 
    InnerId = (int)r.InnerId 
}).ToList();

// 筛选匹配项
var matchingList = NormalList
    .Where(n => resultKeys.Any(r => r.OuterID == n.OuterID && r.InnerId == n.InnerList.InnerId))
    .ToList();

// 筛选不匹配项
var unmatchingList = NormalList
    .Where(n => !resultKeys.Any(r => r.OuterID == n.OuterID && r.InnerId == n.InnerList.InnerId))
    .ToList();

高效实现(用HashSet优化查找性能)

如果ResultList数据量较大,嵌套遍历的时间复杂度会很高(O(N*M)),用HashSet可以把查找复杂度降到O(1),整体效率提升为O(N+M):

// 用值元组作为HashSet的键,存储ResultList中的匹配标识
var resultKeySet = new HashSet<(int OuterID, int InnerId)>(
    ResultList.Select(r => ((int)r.OuterID, (int)r.InnerId))
);

// 筛选匹配项
var matchingList = NormalList
    .Where(n => resultKeySet.Contains((n.OuterID, n.InnerList.InnerId)))
    .ToList();

// 筛选不匹配项
var unmatchingList = NormalList
    .Where(n => !resultKeySet.Contains((n.OuterID, n.InnerList.InnerId)))
    .ToList();

说明

  • 两种写法都能替代原有的嵌套foreach逻辑,代码更简洁、可读性更强
  • 高效实现更适合数据量较大的场景,避免重复遍历ResultList

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 01:45:29