如何从两个对象数组中取值构建第三个Object3数组?
最佳实现方式:使用LINQ关联并投影
对于C#新手来说,用LINQ(Language-Integrated Query)实现这种对象转换会比foreach循环更简洁、可读性更强。核心思路是通过关联两个数组的共同字段(这里是Quality),直接投影生成目标Object3数组。
前提说明
假设你已经有Class1的实例(比如叫sourceData),以及需要赋值的ValidationResultDto实例(比如叫validationResult)。
1. 内连接实现(仅保留两边匹配的项)
如果只有当ObjectType1和ObjectType2存在相同Quality值时才生成Object3,可以用Join方法:
// 先处理空数组,避免空引用异常 var objectType1s = sourceData.ObjectType1 ?? Enumerable.Empty<ObjectType1>(); var objectType2s = sourceData.ObjectType2 ?? Enumerable.Empty<ObjectType2>(); // 关联两个集合并生成Object3数组 validationResult.Object3 = objectType1s .Join( objectType2s, ot1 => ot1.Quality, // ObjectType1的关联键:Quality ot2 => ot2.Quality, // ObjectType2的关联键:Quality (ot1, ot2) => new Object3 // 投影生成目标对象 { Group = ot1.Group, Quality = ot1.Quality, QualityDescription = ot1.QualityDescription, Grid = ot2.Grid, Position = ot2.Position } ) .ToArray();
2. 左连接实现(保留所有ObjectType1的项)
如果需要保留所有ObjectType1的项,即使对应的ObjectType2不存在(此时Grid和Position设为null),可以用GroupJoin配合SelectMany:
var objectType1s = sourceData.ObjectType1 ?? Enumerable.Empty<ObjectType1>(); var objectType2s = sourceData.ObjectType2 ?? Enumerable.Empty<ObjectType2>(); validationResult.Object3 = objectType1s .GroupJoin( objectType2s, ot1 => ot1.Quality, ot2 => ot2.Quality, (ot1, matchingOt2s) => // 即使没有匹配项,也生成Object3(用DefaultIfEmpty()处理空匹配) matchingOt2s.DefaultIfEmpty().Select(ot2 => new Object3 { Group = ot1.Group, Quality = ot1.Quality, QualityDescription = ot1.QualityDescription, Grid = ot2?.Grid, // 空值运算符避免空引用 Position = ot2?.Position }) ) .SelectMany(x => x) // 展开嵌套集合 .ToArray();
为什么比foreach更好?
- 代码更简洁:无需手动管理循环索引、空值判断等细节,逻辑一目了然。
- 可读性更高:LINQ的方法名(
Join、Select)直接表达了操作意图,维护成本更低。 - 减少出错概率:避免手动循环中容易出现的索引越界、空引用等低级错误。
内容的提问来源于stack exchange,提问作者Nullifiable
相关产品推荐
相关产品推荐

