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

如何将嵌套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);

补充说明

  1. 效率优化:原嵌套foreach是O(n*m)的时间复杂度,用HashSet存储匹配ID后,查找操作变为O(1),整体复杂度降到O(n+m),数据量越大优势越明显。
  2. 空值防护:如果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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 13:25:39