2

我有一个 IDictionary(不是通用的,所以我在object这里处理 's),我想从中只获取该 IDictionary 中对应于特定键类型 K 和特定值类型 V 的元素。有一个十亿种方法可以做到这一点,但我发现的最优雅的方法似乎是:

Dictionary<K, V> dict = myIDictionary.OfType<KeyValuePair<K, V>>();

这编译得很好,所以我假设这个方法可以用于字典(它由 IEnumerable 声明)但结果字典是空的,尽管那里肯定有满足这些条件的 KVP。显然,我假设这KeyValuePair<K, V>是它所期望的格式,因为这是枚举字典时使用的格式,但它是别的什么吗?有什么我想念的吗?

4

2 回答 2

4

非泛型IDictionary不使用KeyValue<T,U>类型,因此您永远不会有任何匹配项。

您需要解析这些DictionaryEntry项​​目,并转换它们:

Dictionary<K,V> dict = myIDictionary
                          .Cast<DictionaryEntry>()
                          .Where(de => de.Key is K && de.Value is V)
                          .ToDictionary(de => (K)de.Key, de => (V)de.Value);
于 2013-09-06T16:58:43.627 回答
2

该函数确实根据指定的类型过滤列表......但您的 base 中OfType没有任何类型的内容。你只有非泛型对象包含的任何类型(我现在不肯定 - 也许?)。即使它与该对的泛型类型“匹配”,它也不是真正相同的外部类型。KeyValuePair<K,V>IDictionaryIDictionaryDictionaryEntry

所以这个功能不会做你正在寻找的东西。您需要使用 Where 语句做一些事情。就像是:

var dict = myIDictionary.Where(e => e.Key is typeof(K) && e.value is typeof(V))

尽管那是直接的伪代码,但实际语法并不肯定。

编辑:看起来里德已经很好地阐明了完整的解决方案。

于 2013-09-06T16:59:12.877 回答