如何仅从字典获取特定类型的键值对

时间:2013-09-06 16:53:42

标签: c# dictionary ienumerable oftype

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

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

这编译得很好所以我假设这个方法CAN可以用于字典(它是由IEnumerable声明的)但是生成的字典是空的,尽管肯定有符合这些条件的KVP。显然我假设KeyValuePair<K, V>是它期望的格式,因为这是在字典中枚举时使用的,但它是否还有其他东西?有什么我想念的吗?

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:2)

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

因此该功能无法满足您的需求。你需要用Where语句做一些事情。类似的东西:

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

虽然这是直接伪代码,但实际语法并不正确。

编辑:看起来里德有完整的解决方案,非常好。