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

求助:将foreach循环改写为含JOIN/GroupJoin的LINQ语法

用LINQ的GroupJoin改写你的C#代码

你的原始代码通过遍历myData,分别关联setOneDataList和setTwoDataList,这种场景非常适合用GroupJoin实现——它能一次性将主集合与关联集合按键分组匹配,完全替代循环和Where查询。

改写后的代码

var result = myData
    .GroupJoin(setOneDataList, 
        f => f.ID, 
        b => b.FieldID, 
        (f, setOneItems) => new 
        {
            MyDataItem = f,
            SetOne = setOneItems.Select(t => new CommonClass
            {
                FieldName = t.Field,
                Color = t.Color,
                Status = t.Status
            }).OrderBy(b => b.FieldName)
        })
    .GroupJoin(setTwoDataList, 
        temp => temp.MyDataItem.ID, 
        item => item.FieldID, 
        (temp, setTwoItems) => new FinalClass
        {
            ID = temp.MyDataItem.ID,
            Floor = temp.MyDataItem.Floor,
            Description = temp.MyDataItem.Description,
            SetOne = temp.SetOne,
            SetTwo = setTwoItems.Select(t => new CommonClass
            {
                FieldName = t.Field,
                Color = t.Color,
                Status = t.Status
            }).OrderBy(b => b.FieldName)
        })
    .ToList();

关键说明

  • GroupJoin的作用:它会把主集合中的每个元素,与关联集合中所有匹配键的元素分组绑定,正好对应你原始代码中Where(b => b.FieldID == f.ID)的逻辑
  • 两次GroupJoin:先关联setOneDataList得到临时对象,再用这个临时对象关联setTwoDataList,最终构建FinalClass实例
  • 修复原有问题:你原始代码中setTwo的Where条件存在变量名冲突(setTwoDataList.Where(f => f.FieldID == f.ID)),改写后的代码已避免这个逻辑错误
  • 保留原有行为:完全保留了Select投影CommonClass和OrderBy排序的逻辑,输出结果与原始代码一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 15:10:21