如何遍历“IDictionary”的键和值?

Posted

技术标签:

【中文标题】如何遍历“IDictionary”的键和值?【英文标题】:How to iterate through keys and values of an `IDictionary`? 【发布时间】:2017-08-17 15:20:52 【问题描述】:

如果我不知道其中的键和值的具体类型,我将如何遍历 IDictionary 的键和值,因此只想将它们视为 objects?

如果我这样做:

foreach(var x in myIDictionary) ...

我认为xobject。但是,我将如何从中获取KeyValue(均输入为objects),如IDictionaryEnumerator 中指定的那样?没有泛型参数的IKeyValuePair 不存在吗?

我想我可以使用MoveNext 等手动循环遍历枚举器,但我觉得必须有一种方法可以使用foreach

【问题讨论】:

I think x is an object 你为什么不检查它实际上是什么,而不仅仅是猜测。 @BernardWalters 这是一种派生自对象的类型。它可以转换为“对象”。 x 的类型不是“对象”。 @JosephHumfrey 如果您想了解这些项目是什么,可以查看该类型的文档。 @Servy - 查看答案 - 这并不完全简单(例如“没有明确的类型”与“您可以使用 DictionaryEntry,但并非总是如此”)。但请随时向我指出明确给出明确答案的文档的方向。 @JosephHumfrey 我完全相信您能够自行找到IDictionary 的文档。您不需要我(或其他回答者)为您找到它。 【参考方案1】:

您可以像这样在foreach 中明确指定DictionaryEntry 对类型:

foreach (DictionaryEntry x in myIDictionary)

虽然您应该确定它是IDictionary 的标准实现(例如HashtableDictionary<TKey, TValue>

否则它可以是枚举器中的任何内容。

【讨论】:

也许这是一个挑剔的问题,但没有任何要求 IDictionaryEnumerator.CurrentDictionaryEntry,这就是 foreach 使用的。如果不是这样就很奇怪了,但不违反接口。 我想我的困惑是IDictionary 的枚举器使用DictionaryEntry,而具体的Dictionary<string, int>(例如)将使用KeyValuePair<string, int>(与DictionaryEntry 无关)。所以行为实际上取决于您迭代的字典变量的特定转换。 @JLRishe 是的,确实 @JosephHumfrey 这种混乱是可以理解的。这是因为 GetEnumerator. 的显式实现而起作用的 @JosephHumfrey - 没关系。它仍然有效,通用的Dictionary<T,U> 仍然实现IDictionary,因为它确实可以使用DictionaryEntry,因为实现是显式接口。见dotnetfiddle。【参考方案2】:

您缺少的一点是,如果您迭代 IDictionary,则无法保证值的类型。它们实际上可以是任何东西。唯一的保证是它实现了.GetEnumerator()

如果你想迭代 IDictionary 的内容,你可以迭代它的键:

foreach (object key in myIDictionary.Keys)

    object value = myIDictionary[key];

    // do something with key and value

您还可以将IDictionary 转换为Dictionary<object, object> 以使foreach 更友好一点:

var myDictionary = myIDictionary.Keys
                                .Cast<object>()
                                .ToDictionary(k => k, k => d[k]);

// kv is a KeyValuePair<object, object>
foreach (var kv in dobj)



您甚至可以添加一个扩展方法来为您执行此操作:

public static Dictionary<object, object> ToDictionary(this IDictionary dict)

    return dict.Keys.Cast<object>().ToDictionary(k => k, k => dict[k]);



// usage
// kv is a KeyValuePair<object, object>
foreach (var kv in myIDictionary.ToDictionary())


【讨论】:

以上是关于如何遍历“IDictionary”的键和值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Bash 中间接获取关联数组的键和值?

如何交换散列中的键和值

如何将对象数组操作为不同的键和值? [复制]

如何使用python在mysql中插入python dict的键和值

如何从数组中的对象添加新的键和值?

如何在iOS swift的tableview中使用json响应中的键和值?