2012-08-01 66 views
1

我對以下對象名單:使用C#lambas結合列表<int>和int

var listOfPairs = new List<Pair<int, List<int>>>() { 
    new Pair<int, List<int>>(30, new List<int>() {3, 6, 9}), 
    new Pair<int, List<int>>(40, new List<int>() {4, 8, 12}) 
}; 

我想用列表的-整數下面的列表,以結束:

listOfPairs[0] = {30, 3, 6, 9}; 
listOfPairs[1] = {40, 4, 8, 12}; 

我已經嘗試了很多擺弄,看起來像這樣的,但都無濟於事:

var flattenedListOfPairs = listOfPairs.Select(pair => new List<int>(pair.First).AddRange(pair.Second)); 

我認爲就是我試圖去做是可能的,我只是想念一些東西。幫幫我?

+1

聽起來像是'的SelectMany()'工作? – SpaceBison 2012-08-01 13:35:51

回答

2

這給你列出的清單

var flattened = listOfPairs.Select(pair => Enumerable.Repeat(pair.First, 1) 
                .Concat(pair.Second) 
                .ToList()) 
          .ToList(); 

或者,在表格你詳細說明:

listOfPairs.Select(p => new []{ p.First }.Concat(p.Second).ToList()).ToList() 
+0

@AspNyc請注意,如果您放棄「ToList」的第一個調用,則結果列表的元素將是IEnumerable 而不是列表。 – waldrumpus 2012-08-01 13:51:01

+0

是的,我也意識到這一點。 = P謝謝! – 2012-08-01 14:01:24

5

聽起來像是你可能想是這樣的:

var flattened = listOfPairs.Select(pair => new[] { pair.First }.Concat(pair.Second) 
                   .ToList()) 
          .ToList(); 

或者:使用MoreLINQ

var flattened = listOfPairs.Select(pair => pair.Second.Prepend(pair.First) 
                 .ToList()) 
          .ToList(); 
+0

+1,Concat而不是聯盟X-) – 2012-08-01 13:44:18

+0

Jon,我比你知道的更愛你的MoreLINQ圖書館。我很驚訝很多這些方法都沒有被添加到框架中,儘管有一些我知道沒有被添加的機會。國際海事組織,Concat是這裏的最佳選擇,因爲如果聯盟已經存在,聯盟將消除「第一」號碼。 – SPFiredrake 2012-08-01 13:45:48

+0

waldrumpus獲得他首先發布的答案b/c,但我正在對您的評論進行投票,以便對我的問題進行多種解決方法,並將我介紹給MoreLINQ。 tyvm! – 2012-08-01 13:47:25

1

其他答案已經涵蓋了如何做到這一點,所以我不會在這裏重複。這個答案解釋了爲什麼你現有的代碼不工作。您希望將一個int傳遞給List構造函數,並使用該int初始化List。這不是構造函數的工作原理。 List構造函數使用int參數設置列表的初始大小,而不是設置任何項目的值。

+0

是的,對於C#我還是新的,我試圖在實際使用對象初始化語法(例如{..})時將數據傳遞給構造函數。感謝您指出這一點! – 2012-08-01 14:31:51

0

試試這個:

var flattenedListOfPairs = listOfPairs.Select(pair => 
                { 
                 var list = new List<int>(pair.First); 
                 list.AddRange(pair.Second)); 
                 return list; 
                }.ToList();