C#基于模型中的枚举属性将列表<model>转换为字典<enum,List <model >>?

Lev*_*kon 3 c# linq generics lambda

不要混淆:如何在C#中将List转换为Hashtable?

我有一个模型列表,我想组织成一个散列表,其中枚举作为键,模型列表(具有枚举值)作为值.

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));
Run Code Online (Sandbox Code Playgroud)

将列表转换为看起来像这样的哈希表的最简单方法是什么(原谅json):

{ 
   Blue:
   [
      { Blue, "How", 1 },
      { Blue, "Brown", 3 }
   ],
   Green:
   [
      { Green, "Now", 2 },
      { Green, "Cow", 4 }
   ]
}
Run Code Online (Sandbox Code Playgroud)

当我做这样的事情时:

var taskTable = tasks.Cast<TaskModel>().ToDictionary(o => o.Task); (Where Task is the Enum)
Run Code Online (Sandbox Code Playgroud)

我得到了这个例外:"已经添加了具有相同密钥的项目."

Lambda或Linq的一个衬垫非常受欢迎!

Jon*_*eet 6

它看起来像你可以做到Lookup:

var lookup = models.ToLookup(o => o.Task);
Run Code Online (Sandbox Code Playgroud)

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

var dictionary = models.GroupBy(o => o.Task)
                       .ToDictionary(g => g.Key, g => g.ToList());
Run Code Online (Sandbox Code Playgroud)

  • @Levitikon:LINQ给了他们这么多......如果我能对技术有所了解,LINQ就是它......其次是LINQ to XML. (2认同)