2015-03-13 64 views
5

我有一个列表和MyClass的是:清单词典<键,列表<Value>> - C#

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

我的问题是,如何转换这个名单为Dictionary<Guid, List<Guid>>,在字典的键是GUID来自TypeID属性,并且该值是与TypeID对应的所有NoticeID值的列表。我试图像这样:

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

但这返回一个Dictionary <Guid, List<MyClass>>,我想一个Dictionary<Guid, List<Guid>>

+0

这并不完全清楚你的意思是“但这会返回一个'>'。你想获得什么GUID作为价值? – 2015-03-13 07:21:02

+0

很显然,TypeID是第一个Guid in Dictionary >并且NoticeID是第二个...我在linq子句中提到了 – raresm 2015-03-13 07:31:38

+1

因为您没有实际说明它,所以它不是真的很明显。我们可以推断出来,但如果你明确地说过,并且还指定了“一个字典”,那么列表>而不是“一个>'会是一个更好的问题。编辑你的问题,告诉你我的意思 - 我认为你会同意后更清楚 – 2015-03-13 08:10:42

回答

15

那么,当你组,你可以指定要用于组的每个元素的值:

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); 

查找通常更清洁:

  • 它们是不可改变的,而您的方法最终与lis ts可以修改
  • 它们在类型系统中完全表达您想要表达的内容(一个键值为多个值)
  • 它们通过返回缺少键的空值序列来使查找键更容易,而比抛出异常
+0

谢谢你给我介绍一个非常聪明和方便的类型 - 可以确认任何人仍然使用像这样的列表字典,这种方法非常适合用途 – Toadfish 2017-05-26 01:14:42

相关问题