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

时间:2014-09-03 13:28:56

标签: c# .net linq

假设我有两个Lists<myObject>,其中myObject由两个属性组成

ID (类型Int)和

(类型Double

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

Id, [Double value from List 1], [Double value from List 2]

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

12, 21.75, 19.87

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

15, null, 22.52

我怎样才能实现这一目标? 更新: 当然,我知道如何获得这样的列表,但我正在寻找最有效的方法,最好使用一些机智的Linq魔法

3 个答案:

答案 0 :(得分:13)

不确定这是多么优化,但应该符合您的需求 - 假设我理解您的需求:

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

结果输出类似于:

A: 1 - 6
C: 3 - 7
D: 4 - 8
E: 5 - 9

不要真正理解为什么要返回空值,除非你绝对需要(另外,double是不可为空的,所以它必须是结果的组合条目,而不是)。

答案 1 :(得分:4)

要求略显不清楚。你想要一个笛卡尔积或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};

如果您确实想要完整的外部联接,请参阅this

答案 2 :(得分:0)


  

**让我们说tempAllocationR是列表1,而tempAllocationV是List2 **


var tempAllocation = new List<Object>();
    if (tempAllocationR.Count > 0 && tempAllocationV.Count > 0)
                    {
                        foreach (TempAllocation tv in tempAllocationV)
                        {
                            var rec = tempAllocationR.FirstOrDefault(tr => tr.TERR_ID == tv.TERR_ID && tr.TERR == tv.TERR && tr.Team == tv.Team);
                            if (rec != null)
                            {
                                rec.Vyzulta = tv.Vyzulta;
                            }
                            else
                            {
                                tempAllocationR.Add(tv);
                            }

                        }
                        tempAllocation = tempAllocationR;
                    }}