2016-09-12 33 views
1

我的IEnumerable<MyStruct>MyStruct如下所示:談到IEnumerable的結構與內部的IEnumerable成單個詞典

struct MyStruct 
{ 
    public IEnumerable<string> aliases; 
    public Action action; 
    public MyStruct(IEnumerable<string> aliases, Action action) 
    { 
     this.aliases = aliases; 
     this.action = action; 
    } 
} 

我想變成一本字典這其中關鍵是從aliases和值每串將是action。舉例來說,如果我有我的IEnumerable 2個MyStruct對象,第一個具有別名"o", "on", "one"和行動a1和第二個有別名"t", "tw", "two"和行動a2,我想要的結果字典是這樣的:

{"o", a1}, 
    {"on", a1}, 
    {"one", a1}, 
    {"t", a2}, 
    {"tw", a2}, 
    {"two", a2} 

我想知道Linq有沒有辦法做到這一點?

+0

強制性的評論,確保你實際上需要一個值類型而不是一個類? –

+0

是的,這可能應該更改爲一個類。但我正在努力弄清楚Linq部分。感謝您的領導雖然:) – SalysBruoga

回答

5

您可以使用SelectMany來壓扁別名列表並創建一個包含別名和操作的臨時匿名類型。最後將其轉換拉平列表ToDictionary

IEnumerable<MyStruct> source = ... 
Dictionary<string, Action> result = 
    source.SelectMany(s => s.aliases, (s, alias) => new { Alias = alias, s.action }) 
      .ToDictionary(x => x.Alias, x => x.action); 

的第一個參數SelectMany告訴它選擇aliases,所以第二拉姆達被每MyStruct sMyStruct的每個string alias,並創建一個實例了這兩個值的。

最後,使用alias作爲關鍵字和action作爲值,將此序列轉換爲字典。

請注意,如果別名不是唯一的,則會產生ArgumentException,因爲您無法將兩個相同的密鑰添加到字典中。

+0

令人驚歎的解釋。正如預期的那樣工作,謝謝你:) – SalysBruoga

2

Linq語法來壓扁數據,然後ToDictionary。
您可以使用「SelectMany」來平整數據。

private Dictionary<string, action> FlattenedStructs(IEnumerable<MyStruct> structs) 
{ 
    var flattenedItems = from s in structs 
         from a in s.aliases 
         select new {Alias = a, Action = s.action}; 
    return flattenedItems.ToDictionary(f => k.Alias, f => f.Action); 
} 
+0

一個非常簡單和整潔的版本,榮譽 –

+0

這看起來很棒,非常感謝:) – SalysBruoga