2013-01-04 276 views
0

與LINQ和鍵的字典我有代碼看起來像這樣:創建從嵌套列表

class A { 
public string Name {get;set;} 
public IList<string> Keywords {get;set;} 
} 

...

IList<A> a = new List<A>{ 
     new A{Name = "a1", Keywords = new List<string>{"k1", "k2"}}, 
     new A{Name = "a2", Keywords = new List<string>{"k1", "k3"}}, 
     new A{Name = "a3", Keywords = new List<string>{"k3", "k4"}}, 
     new A{Name = "a4", Keywords = new List<string>{"k1", "k3", "k4"}} 
    }; 

有什麼辦法,我可以使用LINQ創建字典形式如下:

{"k1", List<A> {a1, a2, a4}} 
{"k2", List<A> {a1}} 
{"k3", List<A> {a2, a3, a4}} 
{"k4", List<A> {a3, a4}} 

基本上將對象映射到關鍵字。

感謝

回答

0

喜歡的東西

var dict = a 
    .SelectMany(myA => 
     myA.Keywords.Select(kw => new { Name = myA.Name, Keyword = kw })) 
    .GroupBy(pair => pair.Keyword) 
    .ToDictionary(g => g.Key, g => g.Select(pair => pair.Name).ToList()); 

應該這樣做。

+0

我實際上需要字典,你的版本工作的很好。 – b3n

1

應該這樣做:

var keywordsAndNames = a.SelectMany(anA => anA.Keywords.Select(kw => 
          new { KeyWord = kw, Name = anA.Name })); 
var lookup = keywordsAndNames.ToLookup(entry => entry.KeyWord, entry => entry.Name); 

注意,這個代碼創建一個查詢,而不是一本字典,因爲每個鍵有多個名稱。

lookup["k1"]返回例如產生「a1」,「a2」和「a4」的IEnumerable<string>

+0

如果OP不需要列表,那麼這應該比我的版本更有效:) – Rawling