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

如何用LINQ基于内容相等合并3个数组(非拉链式合并)

用LINQ基于内容相等合并三个数组(非拉链式)

这个需求本质上是要把三个数组按值匹配做「全量关联」,类似数据库的全外连接效果,我来给你具体实现方案:

核心思路

  1. 先提取三个数组中所有出现过的非null整数,去重并排序,得到所有需要匹配的「关键值」;
  2. 对每个关键值,分别在三个数组中查找是否存在匹配元素,存在则取该值,不存在则保留null;
  3. 将每个关键值对应的三个结果组合成元组,最终得到合并后的集合。

完整代码示例

using System;
using System.Linq;

class Program
{
    static void Main()
    {
        // 定义原始数组
        int?[] list1 = { 0, 1, 2, 3, 4 };
        int?[] list2 = { 2, 3, 4, 5 };
        int?[] list3 = { 3, 4 };

        // 步骤1:获取所有唯一的关键值(去重+排序)
        var allKeys = list1.Concat(list2).Concat(list3)
                           .Where(x => x.HasValue)  // 过滤原始数组中可能存在的null值
                           .Select(x => x.Value)
                           .Distinct()
                           .OrderBy(x => x)
                           .ToList();

        // 步骤2:按关键值匹配生成结果
        var result = allKeys.Select(key => (
            Item1: list1.FirstOrDefault(x => x == key),
            Item2: list2.FirstOrDefault(x => x == key),
            Item3: list3.FirstOrDefault(x => x == key)
        )).ToList();

        // 输出验证结果
        foreach (var item in result)
        {
            Console.WriteLine($"({item.Item1 ?? "null"}, {item.Item2 ?? "null"}, {item.Item3 ?? "null"})");
        }
    }
}

代码说明

  • Concat用来合并三个数组的所有元素,Where(x => x.HasValue)过滤掉原始数组中可能存在的null值(如果你的业务需要把null作为有效匹配项,可以去掉这一步);
  • Distinct确保每个关键值只处理一次,OrderBy保证结果按数值从小到大排列,和你期望的输出顺序一致;
  • FirstOrDefault(x => x == key)会在数组中查找第一个等于当前关键值的元素,找不到就返回null(因为数组是int?类型,默认的default(int?)就是null);
  • 这里用了C#的值元组(ValueTuple)来存储每个结果项,结构简洁且易于使用。

运行结果

执行代码后会输出:

(0, null, null)
(1, null, null)
(2, 2, null)
(3, 3, 3)
(4, 4, 4)
(null, 5, null)

完全符合你期望的输出格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:13:05