如何将嵌套foreach循环代码转换为LINQ查询?
用LINQ简化嵌套foreach的匹配赋值逻辑
定义的类结构
public class A { public List<Data> data { get; set; } } public class Data { public int ID { get; set; } public int values { get; set; } } public class B { public List<DifferentData> Data { get; set; } } public class DifferentData { public int NewID { get; set; } public int Differentvalues { get; set; } public string AdditionalInfo { get; set; } }
原实现代码
var TopAClassData = new A(); var TopBClassData = new B(); var anotherItemD = new DifferentData(); foreach (var item in TopAClassData.data) { foreach (var anotherItem in TopBClassData.Data) { if (item.ID == anotherItem.NewID) { item.values = anotherItemD.Differentvalues; } } }
需求说明
当Data的ID与DifferentData的NewID匹配时,将指定DifferentData实例(即anotherItemD)的Differentvalues赋值给Data的values字段。
LINQ简化方案
当然可以用LINQ简化这段逻辑,同时还能优化匹配效率:
// 先提取所有需要匹配的NewID,存入HashSet提升查找效率 var matchingIds = new HashSet<int>(TopBClassData.Data.Select(d => d.NewID)); // 筛选出匹配的Data项并批量赋值 TopAClassData.data .Where(item => matchingIds.Contains(item.ID)) .ToList() // 触发LINQ延迟执行,转为List后调用ForEach .ForEach(item => item.values = anotherItemD.Differentvalues);
补充说明
- 效率优化:原嵌套foreach是O(n*m)的时间复杂度,用HashSet存储匹配ID后,查找操作变为O(1),整体复杂度降到O(n+m),数据量越大优势越明显。
- 空值防护:如果
TopAClassData.data或TopBClassData.Data可能为null,建议先做空判断避免异常:
if (TopAClassData?.data == null || TopBClassData?.Data == null) return; var matchingIds = new HashSet<int>(TopBClassData.Data.Select(d => d.NewID)); TopAClassData.data .Where(item => matchingIds.Contains(item.ID)) .ToList() .ForEach(item => item.values = anotherItemD.Differentvalues);
内容的提问来源于stack exchange,提问作者ANK
相关产品推荐
相关产品推荐

