2012-11-21 53 views
3

非常簡單的問題。我有一個值列表,我想填充空值,這樣我總是有X個項目返回。Enumerable.Repeat Union和Take不返回'Take'值

List<int> list = new List<int>() { 10, 20, 30 }; 

IEnumerable<int> values = list 
    .OrderByDescending(i => i) 
    .Union(Enumerable.Repeat(0 , 5)); 

foreach (var item in values.Take(5)) 
    Console.Write(item + " "); 

我期待輸出像「30 20 10 0 0」但令人驚訝的是我只得到「30 20 10 0」。

foreach (var i in Enumerable.Repeat(0, 5).Take(3)) 
    Console.Write(i + " "); 

此代碼將返回「0 0 0」。同樣「list.Take(3)」返回「30 20 10」。

回答

5

原因是Enumerable.Union刪除重複項。所以你可能想使用Enumerable.Concat,而不是刪除重複項。

我寧願另一種選擇是使用由Enumerable.ElementAtOrdefaultEnumerable.Range選擇從創建的索引的元素,其中,第二個參數是所期望的計數:

IEnumerable<int> values = Enumerable.Range(0, 5) 
      .Select(i => list.ElementAtOrDefault(i)) 
      .OrderByDescending(i => i); 
+0

感謝。我正在考慮一個SQL聯盟。 –

+2

@IanQuigley SQL'union'有一個隱含的不同* too *。爲了避免它,你需要使用'UNION ALL'(這是:concat) –

5

聯合的概念,作爲集合論運作,有一個隱含的「獨特」。如果您不想要:使用Concat而不是Union