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

How to iterate through keys and values of an `IDictionary`?

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

如果我这样做:

foreach(var x in myIDictionary) { ... }

我认为x是一个object。但是我怎样才能得到 KeyValue(都输入为 objects),如 IDictionaryEnumerator 中指定的那样?没有没有通用参数的IKeyValuePair吗?

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

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

foreach (DictionaryEntry x in myIDictionary)

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

否则它可以是枚举器中的任何字面意思。

您遗漏的一点是,如果您迭代 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())
{
}