求助:将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
相关产品推荐
相关产品推荐

