保持Where()与Dictionary一致

时间:2012-06-25 10:10:15

标签: c# dictionary

  

可能重复:
  Recreating a Dictionary from an IEnumerable

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

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

由于

4 个答案:

答案 0 :(得分:2)

IDictionary<TKey, TValue>实际上扩展了IEnumerable<KeyValuePair<TKey, TValue>>。这就是为什么你可以首先在IDictionary<TKey, TValue>上使用LINQ运算符。

然而,LINQ运算符返回IEnumerable<T>,这意味着提供deferred execution,这意味着在您开始迭代IEnumerable<T>之前,实际上并不会生成结果。

IEnumerable<T>提供的IDictionary<TKey, TValue>实施是ICollection<T> interface(其中TKeyValuePair<TKey, TValue>),这意味着如果LINQ要返回IDictionary<TKey, TValue>而不是IEnumerable<KeyValuePair<TKey, TValue>>,那么它必须实现列表,违反它的主体(因此IEnumerable<KeyValuePair<TKey, TValue>>返回值)。

当然,解决这个问题的方法是在ToDictionary上调用Enumerable class扩展方法(正如其他人提到的那样),但是一个小故事永远不会受到伤害。

答案 1 :(得分:1)

到底.ToDictionary()怎么样?

答案 2 :(得分:1)

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

var newDict = yourDict.Where(pair => SomePredicateFrom(pair))
                      .ToDictionary(pair => pair.Key, pair => pair.Value);

答案 3 :(得分:1)

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