C# 如何遍历'IDictionary'的键和值?
如果我不知道其中键和值的具体类型,因此只想将它们作为C# 如何遍历'IDictionary'的键和值?,c#,idictionary,C#,Idictionary,如果我不知道其中键和值的具体类型,因此只想将它们作为对象来处理,那么如何遍历IDictionary的键和值呢 如果我这样做: foreach(myIDictionary中的var x){…} 我认为x是一个对象。但是如何从中获取键和值(都键入为对象s),如IDictionaryEnumerator中指定的那样?不存在没有通用参数的IKeyValuePair,是吗 我想我可以使用MoveNext等手动循环遍历枚举器,但我觉得必须有一种使用foreach的方法 您可以在foreach中明确指定Dic
对象
来处理,那么如何遍历IDictionary
的键和值呢
如果我这样做:
foreach(myIDictionary中的var x){…}
我认为x
是一个对象
。但是如何从中获取键
和值
(都键入为对象
s),如IDictionaryEnumerator
中指定的那样?不存在没有通用参数的IKeyValuePair
,是吗
我想我可以使用
MoveNext
等手动循环遍历枚举器,但我觉得必须有一种使用foreach
的方法 您可以在foreach
中明确指定DictionaryEntry
对类型,如下所示:
foreach (DictionaryEntry x in myIDictionary)
尽管您应该确保它是IDictionary
的标准实现(如Hashtable
或Dictionary
)
否则,它可以是枚举器中的任何内容。您缺少的一点是,如果您迭代一个
IDictionary
,则无法保证值的类型。它们可以是任何东西。唯一的保证是它实现了.GetEnumerator()
如果要迭代IDictionary
的内容,可以迭代其键:
foreach (object key in myIDictionary.Keys)
{
object value = myIDictionary[key];
// do something with key and value
}
您还可以将i词典
转换为词典
,使foreach
更加友好:
var myDictionary = myIDictionary.Keys
.Cast<object>()
.ToDictionary(k => k, k => d[k]);
// kv is a KeyValuePair<object, object>
foreach (var kv in dobj)
{
}
var myDictionary=myIDictionary.Keys
.Cast()
.ToDictionary(k=>k,k=>d[k]);
//kv是一个键值对
foreach(多布吉的var kv)
{
}
您甚至可以添加扩展方法来执行此操作:
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())
{
}
publicstaticdictionary-ToDictionary(此IDictionary dict)
{
返回dict.Keys.Cast().ToDictionary(k=>k,k=>dict[k]);
}
//用法
//kv是一个键值对
foreach(myIDictionary.ToDictionary()中的var kv)
{
}
我认为x是一个对象
为什么不检查它的实际情况,而不仅仅是猜测。@BernardWalters它是从对象派生的类型。它可以转换为“对象”。x
的类型不是“object”。@JosephHumfrey如果你想知道这些项目是什么,你可以查看文档中的类型。@Servy-看看答案-这不是完全简单明了的(例如,“没有一个清晰的类型”v.s.。你可以使用字典entry
,但并不总是如此)。但是,请随意为我指出一个明确给出明确答案的文档方向。@JosephHumfrey我完全相信您能够自己找到IDictionary
的文档。你不需要我(或其他回答者)帮你找到它。也许这是一个吹毛求疵的问题,但没有任何要求IDictionaryEnumerator.Current
必须是DictionaryEntry
,而这正是foreach
所使用的。如果不是这样的话,那会很奇怪,但这并不是违反接口。我想我的困惑点在于,IDictionary
的枚举器使用DictionaryEntry
,而具体的Dictionary
(例如)会使用KeyValuePair
(与词典入口无关
).因此,行为实际上取决于您迭代的字典变量的具体类型。@JLRishe yes,indeed@JosephHumfrey这种混淆是可以理解的。这是因为GetEnumerator的显式实现。
如果您不强制转换为IDictionary
,那么您将无法使用DictOnatoryEntry
在foreach
@JosephHumfrey中-这无关紧要。它仍然有效,通用字典仍然实现IDictionary
,因为它实现了,您仍然可以使用字典entry
,因为实现是显式接口。请参阅。