【问题标题】:How to Get Key-Value Pairs of a Specific Type Only from Dictionary如何仅从字典中获取特定类型的键值对
【发布时间】:2013-09-06 16:53:42
【问题描述】:

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

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

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

【问题讨论】:

  • 字典的运行时类型是什么?
  • 我客的字典类型(实现IDictionary)可以在System.Collections.Specialized找到,里面有ListDictionaryHybridDictionaryOrderedDictionary

标签: c# dictionary ienumerable oftype


【解决方案1】:

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

您需要解析 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);

【讨论】:

  • 谢谢,我认为它最终会成为一个更复杂的 LINQ 查询。那么只是好奇:那么带有 IDictionary 的 OfType 可能的用例是什么?是否存在不返回整个数据集或不返回任何内容的情况?
  • @Maltor 并非如此 - 枚举器将始终是 DictionaryEntry,因为它不是通用的。不过,它对其他非泛型集合很有用。
【解决方案2】:

OfType 函数确实会根据指定的类型过滤列表...但您的基础IDictionary 中没有KeyValuePair&lt;K,V&gt; 类型的任何内容。您只有非泛型 IDictionary 对象包含的任何类型(我目前不肯定 - 也许是 DictionaryEntry?)。即使它与该对的泛型类型“匹配”,它也不是真正相同的外部类型。

因此该功能不会满足您的需求。您需要使用 Where 语句做一些事情。比如:

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

虽然那是直接的伪代码,但并不肯定实际语法是什么。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多