将带有List的字典转换为IEnumerable

我有一本字典:

Dictionary<String, List> test = new Dictionary<String, List>(); 

然后我填充这个字典,因此我需要列表,所以我可以调用Add()。 我的问题是函数需要返回:

 Dictionary<String, IEnumerable> 

有没有简单的方法可以做到这一点,而不是通过我的原始字典和手动循环显而易见的循环?

使用List添加内容但将其添加到Dictionary>更高效,更容易。 这是没有问题,因为List实现IEnumerable ,它甚至不需要强制转换。

这样的事情(伪代码):

 var test = new Dictionary>(); foreach(var x in something) { var list = new List(); foreach(var y in x.SomeCollection) list.Add(y.SomeProperty); test.Add(x.KeyProperty, list); // works since List is also an IEnumerable } 
 return dictionary.ToDictionary(x => x.Key,x => x.Value.AsEnumerable()) 

我也试过这条路线,将Dictionary>转换为ReadOnlyDictionary> 。 当我试图转换为只读字典时,将List转换为IEnumerable的整个目的是创建一个只读集合。 OP的方法存在的问题是:

 Dictionary> errors = new Dictionary>(); errors["foo"] = new List() { "You can't do this" }; Dictionary> readOnlyErrors = // convert errors... readOnlyErrors["foo"] = new List() { "I'm not actually read-only!" }; 

IEnumerable让你觉得这是只读且安全的,而实际上并非如此。 在阅读问题LINQ Convert Dictionary to Lookup a Lookup对象之后更合适,因为它允许您:

  • 将一个键与多个值相关联

  • 您无法使用新值覆盖密钥

     // This results in a compiler error lookUp["foo"] = new List() { ... }; 
  • “多个值”已经定义为IEnumerable

  • 您仍然可以使用相同的外部和内部循环算法来提取单个值:

     ILookup lookup = // Convert to lookup foreach (IGrouping grouping in lookup) { Console.WriteLine(grouping.Key + ":"); foreach (string item in grouping) { Console.WriteLine(" item: " + item); } } 

Dictionary>ILookup

这是一个快速的双线程:

 Dictionary> foos = // Create and populate 'foos' ILookup lookup = foos.SelectMany(item => item.Value, Tuple.Create) .ToLookup(p => p.Item1.Key, p => p.Item2); 

现在,您可以使用与Dictionary>相同的两步循环:

 foreach (IGrouping grouping in lookup) { string key = grouping.Key; foreach (Foo foo in grouping) { // Do stuff with key and foo } } 

来源: LINQ将字典转换为查找

转换为具有IEnumerable值的另一个字典就像尝试将方形钉插入圆孔中一样。 更合适,更安全的方法(从面向对象的角度来看)是将读/写字典转换为查找。 这为您提供了只读对象的真正安全性( Foo项除外,它们可能不是不可变的)。

我甚至可以说,大多数情况下,当使用ReadOnlyDictionary时,您可以使用ILookup并获得相同的function。