在类型为Dictionary<TKey, TValue>
的字典上使用Where方法时,最终会得到IEnumerable<KeyValuePair<TKey, TSource>>
,这会破坏我在开头选择的数据类型。我想要回复一本字典。
也许我没有使用正确的过滤功能。那么你如何通常从字典中过滤元素呢?
由于
答案 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(其中T
是KeyValuePair<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();
。