【问题标题】:How to join two Lists based on common property如何根据共同属性加入两个列表
【发布时间】:2014-09-03 13:28:55
【问题描述】:

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

IdInt 类型)和

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 魔法.

【问题讨论】:

标签: c# .net linq


【解决方案1】:

不确定这是如何优化的,但应该适合您的需求 - 假设我了解您想要什么:

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

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

【讨论】:

  • 当然这不会为不匹配的项目返回 null,它根本不会返回它们。
【解决方案2】:

要求有点不清楚。您想要笛卡尔积还是 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

【讨论】:

    【解决方案3】:

    **假设 tempAllocationR 是列表 1,而 tempAllocationV 是列表 2 **


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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-31
      • 2022-08-06
      • 1970-01-01
      • 2022-12-07
      • 1970-01-01
      • 1970-01-01
      • 2017-12-13
      • 1970-01-01
      相关资源
      最近更新 更多