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

时间:2017-03-24 15:40:23

标签: c# idictionary

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

如果我这样做:

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

我认为xobject。但是,我如何从Key中指定Valueobject(都输入IDictionaryEnumerator s)?没有通用参数的IKeyValuePair没有?

我想我可以使用MoveNext等手动遍历枚举器,但我觉得必须有办法用foreach来完成!

2 个答案:

答案 0 :(得分:11)

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

foreach (DictionaryEntry x in myIDictionary)

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

否则它在枚举器中几乎可以是任何东西。

答案 1 :(得分:3)

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

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

$ANDROID_HOME/tools/bin