1

可能重复:
从 IEnumerable 重新创建字典

当在类型字典上使用 Where 方法时,Dictionary<TKey, TValue>您最终会得到 a IEnumerable<KeyValuePair<TKey, TSource>>,这破坏了我在开始时选择的数据类型。我想返回一本字典。

也许我没有使用正确的过滤功能。那么你通常如何从字典中过滤元素呢?

谢谢

4

4 回答 4

2

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(正如其他人提到的那样),但一点背景故事永远不会受到伤害。

于 2012-06-26T12:05:44.767 回答
1

最后怎么.ToDictionary()办?

于 2012-06-25T10:13:41.227 回答
1

您可以使用Where(),然后使用ToDictionary()

var newDict = yourDict.Where(pair => SomePredicateFrom(pair))
                      .ToDictionary(pair => pair.Key, pair => pair.Value);
于 2012-06-25T10:13:45.897 回答
1

.ToDictionary();在您的 LINQ 表达式中使用。

于 2012-06-25T10:14:45.753 回答