如何使用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
相关产品推荐
相关产品推荐

