将带有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。