2014-09-03 38 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