如何用LINQ基于内容相等合并3个数组(非拉链式合并)
用LINQ基于内容相等合并三个数组(非拉链式)
这个需求本质上是要把三个数组按值匹配做「全量关联」,类似数据库的全外连接效果,我来给你具体实现方案:
核心思路
- 先提取三个数组中所有出现过的非null整数,去重并排序,得到所有需要匹配的「关键值」;
- 对每个关键值,分别在三个数组中查找是否存在匹配元素,存在则取该值,不存在则保留
null; - 将每个关键值对应的三个结果组合成元组,最终得到合并后的集合。
完整代码示例
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
相关产品推荐
相关产品推荐

