如何遍历“IDictionary”的键和值?
How to iterate through keys and values of an `IDictionary`?
如果我不知道其中的键和值的具体类型,我将如何遍历 IDictionary
的键和值,因此只想将它们视为 object
s ?
如果我这样做:
foreach(var x in myIDictionary) { ... }
我认为x
是一个object
。但是我怎样才能得到 Key
和 Value
(都输入为 object
s),如 IDictionaryEnumerator
中指定的那样?没有没有通用参数的IKeyValuePair
吗?
我想我可以使用 MoveNext
等手动遍历枚举器,但我觉得必须有一种方法可以使用 foreach
!
您可以像这样在 foreach
中明确指定 DictionaryEntry
对类型:
foreach (DictionaryEntry x in myIDictionary)
尽管您应该确定它是 IDictionary
的标准实现(例如 Hashtable
或 Dictionary<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())
{
}
如果我不知道其中的键和值的具体类型,我将如何遍历 IDictionary
的键和值,因此只想将它们视为 object
s ?
如果我这样做:
foreach(var x in myIDictionary) { ... }
我认为x
是一个object
。但是我怎样才能得到 Key
和 Value
(都输入为 object
s),如 IDictionaryEnumerator
中指定的那样?没有没有通用参数的IKeyValuePair
吗?
我想我可以使用 MoveNext
等手动遍历枚举器,但我觉得必须有一种方法可以使用 foreach
!
您可以像这样在 foreach
中明确指定 DictionaryEntry
对类型:
foreach (DictionaryEntry x in myIDictionary)
尽管您应该确定它是 IDictionary
的标准实现(例如 Hashtable
或 Dictionary<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())
{
}