2014-09-03 107 views
4

假设我有两个Lists<myObject>其中myObject由两个属性如何基于共同财产连接两个列表

标识

价值(的Double型)(的Int型)和

我需要从这样的(匿名)对象构成的这两个列表中列出一个列表:

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

因此,如果为给定ID这两个列表包含一个值,它应该是这样的例子:

12, 21.75, 19.87 

如果一个列表中不包含具有ID存在于其他列表中的对象,值应该是

15, null, 22.52 

我怎样才能做到这一点? 更新:我知道我怎么能得到这样一个列表,当然,但我正在寻找最高性能的方式来做到这一点,最好是通过使用一些机智的Linq魔术。

+1

这可能是使用'Zip'方法:http://msdn.microsoft.com/en-ca/library/vstudio/dd267698%28v=vs.100%29.aspx – Matthew 2014-09-03 13:30:52

+0

@Matthew'Zip '方法不能用来做到这一点。 – Stijn 2017-09-04 14:19:49

回答

6

不知道如何优化这个,而是应该满足您的需求 - 假设我理解你想要的东西:

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不是空的,所以它必须是结果的组合条目,而不是null)。

+0

当然这不会为不匹配的项目返回null,它根本不会返回它们。 – t0yk4t 2014-09-03 13:41:42

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