如何使用LINQ?</string,>获取Dictionary <string,list <object =“”>

时间:2010-09-22 22:32:42

标签: c# linq dictionary

我有一个看起来像这样的对象:

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 个答案:

答案 0 :(得分:6)

你见过Lookup班吗? (msdn

您可以通过调用Enumerable.ToLookup()方法(msdn)来创建它

这基本上就是你想要的,并处理欺骗键。

答案 1 :(得分:5)

是的,有一种方法,但要完成这项工作,你需要先将它们分组(以避免重复的密钥):

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

(当你在它的时候,我想知道这个和.ContainsKey()方式的表现是什么)

答案 2 :(得分:0)

你可以使用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);