代码之家  ›  专栏  ›  技术社区  ›  Francisco Noriega

如何使用LINQ获取Dictionary<string,List<Object>?

  •  1
  • Francisco Noriega  · 技术社区  · 15 年前

    我有一个物体看起来像这样:

    class Model
    {
       public string Category {get;set;}
       public string Description {get;set;}
    }
    

    目前,我正在使用Linq获取这些对象的完整列表,然后手动设置字典,如下所示:

       List<Model> models = //get list from repository and then with linq order them by category and description
    
    Dictionary<string, List<Model>> dict= new Dictionary<string, List<Model>>();
    
                foreach (var m in models)            {
                    if (dict.ContainsKey(m.Category))
                    {
                        dict[m.Category].Add(m);
                    }
                    else
                    {
                        dict.Add(m.Category, new List<Model> { m });
                    }    
                }
    

    这样我就可以通过使用键访问某个类别的所有模型。

    有没有办法直接用LINQ查询生成字典?

    3 回复  |  直到 15 年前
        1
  •  6
  •   Andrew Barber Eric Lafortune    15 年前

    Lookup 上课?( msdn )

    msdn )

    它基本上就是你想要的,并且处理复制键。

        2
  •  5
  •   Sander Rijken    15 年前

    是的,有办法做到这一点,但要做到这一点,您需要首先对它们进行分组(以避免重复键):

    var dict = (from model in models
                group model by model.Category into g
                select g).ToDictionary(x => x.Key, x => x.ToList());
    

    (当您使用它时,我想知道此方法和.ContainsKey()方法的性能如何)

        3
  •  0
  •   KeithS    15 年前

    您可以使用Aggregate()隐藏foreach逻辑,但正如我上次向其建议的OP所说,这是Linq中的一个循环。

    关于:

    var myDictionary = (from m in models
                       group m by m.Category into theGroup
                       select new {Key = m.Category, Value = theGroup.ToList()))
                       .ToDictionary(x=>x.Key, x=>x.Value);