2016-03-11 133 views
1

我有一個對象列表,每個對象都包含一個字符串列表,我想使用在其列表中包含相同值的組對象。 我想這樣的事情,但它把他們都在同一個列表。我如何分組嵌套列表?

List<Item> Items = new List<Item>(); 
Item Item1 = new Item(); 
Item1.Id = "1"; 
Item1.Names.AddRange(new List<string> { "A" }); 
Items.Add(Item1); 

Item Item2 = new Item(); 
Item2.Id = "2"; 
Item2.Names.AddRange(new List<string> { "B" }); 
Items.Add(Item2); 

Item Item3 = new Item(); 
Item3.Id = "3"; 
Item3.Names.AddRange(new List<string> { "A", "C" }); 
Items.Add(Item3); 

List<List<Item>> GroupedItems = Items.GroupBy(u => u.Names.GroupBy(s => s)).Select(t => t.ToList()).ToList(); 

我想什麼有發生在這種情況下是GroupedItems包含兩個列表,第一個是包含Item1Item3,第二個包含Item2

+0

還不清楚試圖完成什麼。當你想使用LINQ'GroupBy'操作時,你應該提供一個'keySelector'函數,這個函數將會爲你的集合中的每個項目生成一個關鍵對象。然後所有具有相同關鍵對象的項目將被分組在一起。 –

+0

假設你有'item1.Names = {「A」,「B」},'item2.Names = {「A」,「C」},'item3.Names = {「B」,「C」} '。你想在這種情況下收到什麼? –

+0

@IvanGritsenko我只是想在列表中將具有相似值的項目組合在一起。如果同一個項目出現在多個組中,則無關緊要。謝謝。 – Rick

回答

0
List<List<Item>> GroupedItems = Items 
    // Select only distinct names that can occur 
    .SelectMany(x => x.Names).Distinct() 
    // For every unique name find items that have it in Names 
    .Select(name => Items.Where(x => x.Names.Contains(name)).ToList()) 
    .ToList(); 
+0

非常感謝Ivan – Rick

+0

@Rick,不客氣。 –