可能重复:
从 IEnumerable 重新创建字典
当在类型字典上使用 Where 方法时,Dictionary<TKey, TValue>
您最终会得到 a IEnumerable<KeyValuePair<TKey, TSource>>
,这破坏了我在开始时选择的数据类型。我想返回一本字典。
也许我没有使用正确的过滤功能。那么你通常如何从字典中过滤元素呢?
谢谢
可能重复:
从 IEnumerable 重新创建字典
当在类型字典上使用 Where 方法时,Dictionary<TKey, TValue>
您最终会得到 a IEnumerable<KeyValuePair<TKey, TSource>>
,这破坏了我在开始时选择的数据类型。我想返回一本字典。
也许我没有使用正确的过滤功能。那么你通常如何从字典中过滤元素呢?
谢谢
IDictionary<TKey, TValue>
实际上延伸IEnumerable<KeyValuePair<TKey, TValue>>
。这就是为什么您首先可以在 an 上使用 LINQ 运算符的原因IDictionary<TKey, TValue>
。
但是,LINQ 运算符返回IEnumerable<T>
旨在提供延迟执行,这意味着在您开始迭代IEnumerable<T>
.
提供的IEnumerable<T>
实现是通过IDictionary<TKey, TValue>
接口ICollection<T>
(其中T
是 a KeyValuePair<TKey, TValue>
)来实现的,这意味着如果 LINQ 要返回IDictionary<TKey, TValue>
而不是IEnumerable<KeyValuePair<TKey, TValue>>
then 它必须实现列表,从而违反它的原则(因此IEnumerable<KeyValuePair<TKey, TValue>>
返回值)。
当然,绕过它的方法是调用上的ToDictionary
扩展方法Enumerable class
(正如其他人提到的那样),但一点背景故事永远不会受到伤害。
最后怎么.ToDictionary()
办?
您可以使用Where(),然后使用ToDictionary():
var newDict = yourDict.Where(pair => SomePredicateFrom(pair))
.ToDictionary(pair => pair.Key, pair => pair.Value);
.ToDictionary();
在您的 LINQ 表达式中使用。