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
,因为实现是显式接口。请参阅。