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

如何从两个对象数组中取值构建第三个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 20:55:29