如何迭代`IDictionary`的键和值?

20 浏览
0 Comments

如何迭代`IDictionary`的键和值?

如果我不知道IDictionary中的键和值的具体类型,因此想将它们视为object,那么我该如何迭代键和值呢?

如果我这样做:

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

我认为x是一个object。但是我怎样才能以object类型为参数,获取出KeyValue,正如IDictionaryEnumerator中指定的那样? 是否有没有参数的IKeyValuePair?

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

admin 更改状态以发布 2023年5月23日
0
0 Comments

你忽略的一点是,如果你迭代一个IDictionary,其值的类型是没有保证的,它们可以是任何类型。唯一保证的是,它实现了.GetEnumerator()方法。

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

foreach (object key in myIDictionary.Keys)
{
    object value = myIDictionary[key];
    // do something with key and value
}

你甚至可以将你的IDictionary转换为Dictionary,使foreach更加友好:

var myDictionary = myIDictionary.Keys
                                .Cast()
                                .ToDictionary(k => k, k => d[k]);
// kv is a KeyValuePair
foreach (var kv in dobj)
{
}

你甚至可以添加一个扩展方法来实现这一点:

public static Dictionary ToDictionary(this IDictionary dict)
{
    return dict.Keys.Cast().ToDictionary(k => k, k => dict[k]);
}
// usage
// kv is a KeyValuePair
foreach (var kv in myIDictionary.ToDictionary())
{
}

0
0 Comments

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

foreach (DictionaryEntry x in myIDictionary)

但是,您应该确保它是IDictionary的标准实现(例如HashtableDictionary

否则,在枚举器中可能是任何东西。

0