【问题标题】:LINQ - grouping by name to Dictionary<string, List<T>>LINQ - 按名称分组到 Dictionary<string, List<T>>
【发布时间】:2016-05-05 10:40:27
【问题描述】:

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

我已经做到了这一点:

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

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

非常感谢!

【问题讨论】:

  • 不重复的书呢?你也想包括它们吗?
  • b =&gt; b.ToList() 应该可以工作
  • 呃,g.Count() &gt;= 1 看起来冗余

标签: c# linq dictionary


【解决方案1】:

作为替代方案,您可能只需要Lookup&lt;String, Book&gt; 而不是繁琐的Dictionary&lt;String, List&lt;Book&gt;&gt;

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

如果是Dictionary&lt;String, List&lt;Book&gt;&gt;

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

请注意.Where(g =&gt; g.Count() &gt;= 1)冗余的

【讨论】:

  • 谢谢!我决定使用ToLookup,因为它似乎是一个更充分的解决方案。但我现在苦苦挣扎的是如何在视图中渲染 Name 属性。以前,对于一个简单的书籍列表,我使用了@Html.DisplayNameFor(model => model.Name)`,它起作用了。您可能知道在使用 Lookup 时如何访问此属性吗?试过@Html.DisplayNameFor(model =&gt; model.FirstOrDefault(),这会给我第一对,但我不知道如何访问 Book 对象及其内部的属性。谢谢!
  • @Dandry: 因为LookUp&lt;String, Book&gt; 实现了IEnumerable&lt;IGrouping&lt;String, Book&gt;&gt;,你可能想要@Html.DisplayNameFor(model =&gt; model.Key) 之类的东西;获取 Book 实例模型 => model.FirstOrDefault().Select(book => ...)` 因为 IGrouping&lt;String, Book&gt; 实现 IEnumerable&lt;Book&gt;
  • 那些不知何故不起作用。但是,我设法让这个工作:@Html.DisplayNameFor(model =&gt; model.First().First().Name)。非常感谢!
【解决方案2】:

您应该像这样简单地使用ToList()

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

每个组都有一个Key 属性,这是关键。它也是(组)是一个IEnumerable&lt;Book&gt;,它代表组中的项目,这就是ToList() 起作用的原因。

【讨论】:

    【解决方案3】:

    尝试ToListdistinct 例如在一个表中,一列可能包含许多重复值;有时您只想列出不同的(不同的)值。

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

    请不要使用.Where(g =&gt; g.Count() &gt;= 1)这是多余的

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-17
      • 1970-01-01
      • 2018-01-25
      • 1970-01-01
      • 1970-01-01
      • 2019-11-27
      • 1970-01-01
      • 2013-08-28
      相关资源
      最近更新 更多