如何在使用LINQ语句添加指示值源的元数据的同时合并两个列表
本文关键字:合并 元数据 列表 两个 LINQ 语句 指示 添加 | 更新日期: 2023-09-27 18:00:17
给定,例如:
var a = new List<int>(){ 1 , 2 , 50 };
var b = new List<int>(){ 9 , 7 , 2 };
我需要将它们合并到一个排序列表中,同时添加一些指示它们来源的数据(a
或b
)。例如,输出类似于:
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 ...
)?
不是查询表单,但应该可以工作。
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);