如何基于共同属性加入两个列表

Rob*_*ert 10 .net c# linq

假设我有两个Lists<myObject>地方myObject由两个属性

Id(类型Int)和

价值(类型Double)

我需要从这两个列表中获取一个由(匿名)对象组成的列表:

Id, [Double value from List 1], [Double value from List 2]
Run Code Online (Sandbox Code Playgroud)

因此,如果对于给定的Id,两个列表都包含值,则它应该如下所示:

12, 21.75, 19.87
Run Code Online (Sandbox Code Playgroud)

如果一个列表不包含具有另一个列表中存在的Id的对象,则该值应为null:

15, null, 22.52
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点? 更新:当然,我知道如何获得这样的列表,但我正在寻找最高性能的方法,最好使用一些机智的Linq魔法.

t0y*_*k4t 15

不确定这是多么优化,但应该适合您的需求 - 假设我理解你想要的东西:

var enumerable1 = new[]
{
    new {Id = "A", Value = 1.0},
    new {Id = "B", Value = 2.0},
    new {Id = "C", Value = 3.0},
    new {Id = "D", Value = 4.0},
    new {Id = "E", Value = 5.0},
};

var enumerable2 = new[]
{
    new {Id = "A", Value = 6.0},
    new {Id = "NOT PRESENT", Value = 542.23},
    new {Id = "C", Value = 7.0},
    new {Id = "D", Value = 8.0},
    new {Id = "E", Value = 9.0},
};

var result = enumerable1.Join(enumerable2, arg => arg.Id, arg => arg.Id,
    (first, second) => new {Id = first.Id, Value1 = first.Value, Value2 = second.Value});

foreach (var item in result)
    Console.WriteLine("{0}: {1} - {2}", item.Id, item.Value1, item.Value2);
Console.ReadLine();
Run Code Online (Sandbox Code Playgroud)

结果输出类似于:

A: 1 - 6
C: 3 - 7
D: 4 - 8
E: 5 - 9
Run Code Online (Sandbox Code Playgroud)

不要真的明白为什么你想要返回null值,除非你绝对需要(此外,double是不可为空的,所以它必须是结果的组合条目,而不是null).


Igo*_*huk 5

要求尚不清楚。您要使用笛卡尔积还是ID上的联接?如果是后者,那么这应该起作用:

var result = from l1 in list1
             join l2 in list2
               on l1.Id equals l2.Id
             select new {l1.Id, Value1 = l1.Value, Value2 = l2.Value};
Run Code Online (Sandbox Code Playgroud)

如果您实际上想要完整的外部联接,请参见this