LINQ - 按名称分组到Dictionary <string,list <t =“”>&gt;

时间:2016-05-05 10:40:28

标签: c# linq dictionary

我正在构建一个库应用程序。我有一个书籍列表,其中一些书籍有一个重复的名称(同一本书的副本很少)。我想将列表转换为Dictionary&gt;,其中字符串将是书的名称,List将包含具有此名称的所有Book对象。

我设法做到这一点:

var result  = queriedBooks
                .GroupBy(b => b.Name)
                .Where(g => g.Count() >= 1)
                .ToDictionary(b => b.Key, /// );

这是我被卡住的地方。我不知道该作为一个值传递什么。 Intellisense也没有帮助,因为没有Value属性可用。我想避免使用匿名对象,因为每个Book条目都有许多我在视图中使用的属性。

非常感谢!

3 个答案:

答案 0 :(得分:6)

您应该像这样使用ToList()

.ToDictionary(b => b.Key, b => b.ToList());

每个组都有Key属性,这是关键。它(该组)也是一个IEnumerable<Book>,代表组中的项目,这就是ToList()工作的原因。

答案 1 :(得分:6)

作为替代方案,您可能只想Lookup<String, Book>而不是精简版Dictionary<String, List<Book>>

   LookUp<String, Book> result = queriedBooks
     .ToLookup(book => book.Name);

如果是Dictionary<String, List<Book>>

   var result = queriedBooks
     .GroupBy(book => book.Name) 
     .ToDictionary(chunk => chunk.Key, chunk => chunk.ToList());

请注意,.Where(g => g.Count() >= 1) 多余;

答案 2 :(得分:1)

尝试使用ToList distinct,例如在表中,列可能包含许多重复值;有时你只想列出不同的(不同的)值。

var query  = queriedBooks
            .Distinct()
            .GroupBy(b => b.Name)
            .ToDictionary(b => b.Key, b.ToList() );

请不要使用它.Where(g => g.Count() >= 1)这是多余的