如果我不知道其中的键和值的具体类型,我将如何迭代IDictionary
的键和值,因此只想将它们视为object
s ?
如果我这样做:
foreach(var x in myIDictionary) { ... }
我认为x
是object
。但是,我如何从Key
中指定Value
和object
(都输入IDictionaryEnumerator
s)?没有通用参数的IKeyValuePair
没有?
我想我可以使用MoveNext
等手动遍历枚举器,但我觉得必须有办法用foreach
来完成!
答案 0 :(得分:11)
您可以在DictionaryEntry
中明确指定foreach
对类型:
foreach (DictionaryEntry x in myIDictionary)
虽然您应该确定它是IDictionary
的标准实施(例如Hashtable
或Dictionary<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