如何在使用LINQ语句添加指示值源的元数据的同时合并两个列表

本文关键字:合并 元数据 列表 两个 LINQ 语句 指示 添加 | 更新日期: 2023-09-27 18:00:17

给定,例如:

var a = new List<int>(){ 1 , 2 , 50 };
var b = new List<int>(){ 9 , 7 , 2 };

我需要将它们合并到一个排序列表中,同时添加一些指示它们来源的数据(ab)。例如,输出类似于:

mergedList = { {1,false},{2,false},{2,true},{7,true},{9,true},{50,false} }

true表示它来自a)。

编辑开始

mergedList =
{ {1,IsB=false},{2,IsB=false},{2,IsB=true},{7,IsB=true},{9,IsB=true},{50,IsB=false} }

编辑结束

如何使用LINQ,最好是查询语句形式(from ... select ...)?

如何在使用LINQ语句添加指示值源的元数据的同时合并两个列表

不是查询表单,但应该可以工作。

var ans = a.Select(i => new { Value = i, FromA = true })
           .Concat(b.Select(i => new { Value = i, FromA = false }))
           .OrderBy(i => i.Value); 

您可以创建一个具有附加属性的匿名类型:

var a = new List<int>(){ 1 , 2 , 50 };
var b = new List<int>(){ 9 , 7 , 2 };
var ax = a.Select(i => new{ Num = i, FromB = false });
var bx = b.Select(i => new{ Num = i, FromB = true});
var merged = ax.Concat(bx).OrderBy(x => x.Num);  

注意,Enumerable.Concat不会消除怀疑,但由于您想添加原点,我认为这是所需的。

输出:

foreach(var x in merged)
    Console.WriteLine("Num: {0} From-B? {1}", x.Num, x.FromB);

演示

var aItems = from aa in a
             select new {Value = aa, Indicator = true};
var bItems = from bb in b
             select new {Value = bb, Indicator = false};
var result = aItems.Concat(bItems).OrderBy(t => t.Value);

纯方法语法:

var aItems = a.Select(aa => new {Value = aa, Indicator = true});
var bItems = b.Select(bb => new {Value = bb, Indicator = false});
var result = aItems.Concat(bItems).OrderBy(t => t.Value);

我认为您可以使用匿名类型来做到这一点:

var mergedList = a.Select(x => new {val = x, tag = true})
                  .Union(b.Select(x => new {val = x, tag = false}))
                  .OrderBy(x => x.val);