【问题标题】:List to Dictionary<Key, List<Value>> - C#列表到字典<Key, List<Value>> - C#
【发布时间】:2015-05-15 14:37:19
【问题描述】:

我有一个列表,MyClass 是:

public class MyClass
{
    public bool Selected { get; set; }
    public Guid NoticeID { get; set; }
    public Guid TypeID { get; set; }
}

我的问题是,如何将此列表转换为Dictionary&lt;Guid, List&lt;Guid&gt;&gt;,其中字典键是TypeID 属性中的GUID,值是与该@ 对应的所有NoticeID 值的列表987654325@。我试过这样:

list.GroupBy(p => p.TypeID).ToDictionary(p => p.Key, p => p.ToList())

但这会返回一个Dictionary &lt;Guid, List&lt;MyClass&gt;&gt;,而我想要一个Dictionary&lt;Guid, List&lt;Guid&gt;&gt;

【问题讨论】:

  • 完全不清楚你的意思是“但是这会返回一个`>`。你想得到什么GUID作为一个值?
  • 很明显TypeID是Dictionary>中的第一个Guid,NoticeID是第二个...我在linq子句中提到
  • 这不是真的明显,因为你并没有真正说明它。我们可以推断出来,但如果您明确说明并指定“a Dictionary&lt;Guid, List&lt;MyClass&gt;&gt;”而不只是“a >`”,那将是一个更好的问题。将您的问题编辑为告诉你我的意思 - 我想你以后会同意它更清楚。
  • 很抱歉给您带来不便。我认为这很明显
  • @reresm:您正在与 Jon Skeet 交谈,他正在帮助您解决问题。

标签: c# list dictionary


【解决方案1】:

好吧,当你分组时,你可以为组的每个元素指定你想要的值:

var dictionary = list.GroupBy(p => p.TypeID, p => p.NoticeID)
                     .ToDictionary(p => p.Key, p => p.ToList());

但是,我强烈考虑使用查找而不是字典:

var lookup = list.ToLookup(p => p.TypeID, p => p.NoticeID);

查找通常更清晰:

  • 它们是不可变的,而您的方法最终得到可以修改的列表
  • 它们在类型系统中准确表达您想要表达的内容(一个键对多个值)
  • 它们通过为丢失的键返回空值序列而不是引发异常,从而使查找键更容易

【讨论】:

  • 感谢您向我介绍了一种非常聪明和方便的类型 - 可以让仍在使用此类列表字典的任何人确认这种方法更适合目的
猜你喜欢
  • 2011-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 2021-02-14
  • 2011-03-19
  • 2020-07-27
相关资源
最近更新 更多