2010-10-20 66 views
2

我需要從兩個包含給定值的列表中檢索所有項目。需要合併兩個數據集合的幫助

例子:

var list1 = { 
    new Dummy(){ Name = "Dummy1", Number = 1 }, 
    new Dummy(){ Name = "Dummy2", Number = 2 }, 
    new Dummy(){ Name = "Dummy3", Number = 3 } 
}; 

var list2 = { 
    new Dummy(){ Name = "Dummy4", Number = 4 }, 
    new Dummy(){ Name = "Dummy5", Number = 2 }, 
    new Dummy(){ Name = "Dummy6", Number = 6 } 
}; 

var list3 = GetAllDummiesWithNumbersContainedInBothLists(); 

我想項目list3包含Dummy2Dummy5,因爲兩者具有相同的號碼。

我該怎麼做?它應該很簡單,但我不知道它...

+0

大資源,LINQ引用... HTTP://msdn.microsoft.com/en-us/vcsharp/aa336746.aspx – 2010-10-20 19:28:13

回答

1

我不完全確定你的要求是什麼,但也許這樣的事情?

var commonIds = list1.Select(d => d.Number) 
        .Intersect(list2.Select(d => d.Number)); 

var commonIdsSet = new HashSet<int>(commonIds); 

var list3 = list1.Concat(list2) 
       .Where(d => commonIdsSet.Contains(d.Number)) 
       .ToList(); 

如果你能澄清的具體要求(做的結果需要由Number進行分組,是Number獨特的列表等內的項目),我們可以提供更好的解決方案。

1
var list3 = list1.Where(d => list2.Select(d2 => d2.Number).Contains(d.Number)) 
    .Union(list2.Where(d2 => list1.Select(d => d.Number).Contains(d2.Number))); 
+0

不太。這會返回一個「bool」。 – 2010-10-20 19:35:49

+0

@Ahmad - 是的。我有兩個不同的答案合併在一起,忘記改變最後一點。完成。 – 2010-10-20 19:37:07

+0

@Ani - 是的,會的。需要聯盟的結果看另一種方式。 – 2010-10-20 19:41:13

2

看看這對你的作品:

(from dummy1 in list1 
join dummy2 in list2 on dummy1.Number equals dummy2.Number 
from dummy in new[] { dummy1, dummy2 } 
select dummy) 
.Distinct() 

這對匹配的假人到相同的範圍,然後趨於平緩設定,所以你得到所有的比賽在一個序列。最後的Distinct可確保每個虛擬對象僅出現一次,即使任一列表包含重複的數字。

0

這裏還有一個!

var list3 = list1 
    .SelectMany(x => list2 
    .SelectMany(y => 
    (y.Number == x.Number) ? new [] { x, y } : new Dummy[]{} 
    ) 
); 
+0

我坦率地承認,這可能不是最好的,但賈斯汀首先發布了我的原始答案,所以我覺得有必要發現另一種方式! – diceguyd30 2010-10-20 20:00:25