2011-10-27 37 views
2

不要與混淆:How can I convert List to Hashtable in C#?C#根據模型中的枚舉屬性將列表<model>轉換爲字典<枚舉,列表<model>>?

我有,我想組織與枚舉作爲密鑰的哈希表模型的列表,以及模型(即有枚舉的值)值的列表。

public enum MyEnum 
{ 
    Blue, 
    Green 
} 

public class MyModel 
{ 
    public MyModel(MyEnum myEnum, string foo, int bar) 
    { 
     this.MyEnum = myEnum; 
     this.Foo = foo; 
     this.Bar = bar; 
    } 

    public MyEnum MyEnum { get; set; } 
    public string Foo { get; set; } 
    public int Bar { get; set; } 
} 

List<MyModel> models = new List<MyModel>(); 

models.Add(new MyModel(MyEnum.Blue, "How", 1)); 
models.Add(new MyModel(MyEnum.Green, "Now", 2)); 
models.Add(new MyModel(MyEnum.Blue, "Brown", 3)); 
models.Add(new MyModel(MyEnum.Green, "Cow", 4)); 

什麼是列表轉換成一個哈希表是這樣的最簡單的方法(原諒JSON):

{ 
    Blue: 
    [ 
     { Blue, "How", 1 }, 
     { Blue, "Brown", 3 } 
    ], 
    Green: 
    [ 
     { Green, "Now", 2 }, 
     { Green, "Cow", 4 } 
    ] 
} 

當我做這樣的事情:

var taskTable = tasks.Cast<TaskModel>().ToDictionary(o => o.Task); (Where Task is the Enum) 

我得到這個例外:「一個項目有相同的密鑰已被添加。」

與Lambda或Linq的一個內襯讚賞!

回答

6

它看起來對我來說,你可以用Lookup做:

var lookup = models.ToLookup(o => o.Task); 

或者,如果你真的想Dictionary<MyEnum, List<TaskModel>>

var dictionary = models.GroupBy(o => o.Task) 
         .ToDictionary(g => g.Key, g => g.ToList()); 
+0

完美!我喜歡1線優雅的解決方案! – Levitikon

+2

@Levitikon:LINQ提供了很多這樣的功能......如果我可以對某種技術有一個迷戀,那麼LINQ就是...... LINQ to XML。 –

+0

@JonSkeet:你太對了! Linq是MS有史以來最好的發明之一。它使得編碼(在很多情況下)更具可讀性。但是就像生活中總是那樣:沒有更糟的情況下你不能得到好處 - 有時你可以發表聲明讓他們閱讀! ;-) – Fischermaen

相關問題