1

给定,例如:

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 ...)?

4

4 回答 4

4

不是查询表格,但应该可以。

var ans = a.Select(i => new { Value = i, FromA = true })
           .Concat(b.Select(i => new { Value = i, FromA = false }))
           .OrderBy(i => i.Value); 
于 2013-02-19T13:08:06.860 回答
3

您可以使用附加属性创建匿名类型:

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);

演示

于 2013-02-19T13:09:21.743 回答
2
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);
于 2013-02-19T13:07:36.313 回答
1

我认为您可以使用匿名类型执行此操作:

var mergedList = a.Select(x => new {val = x, tag = true})
                  .Union(b.Select(x => new {val = x, tag = false}))
                  .OrderBy(x => x.val);
于 2013-02-19T13:14:35.990 回答