如何遍历"IDictionary"的键和值?

Jos*_*rey 6 c# idictionary

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

如果我这样做:

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

我认为x是一个object.但我怎么会得到KeyValue出它(这两个类型为objectS),在指定的IDictionaryEnumerator?有IKeyValuePair没有通用参数吗?

我想我可以手动循环使用枚举器MoveNext等,但我觉得必须有办法做到这一点foreach!

Lan*_*kin 15

您可以像这样明确指定DictionaryEntry对类型foreach:

foreach (DictionaryEntry x in myIDictionary)
Run Code Online (Sandbox Code Playgroud)

虽然你应该确定它是IDictionary(像HashtableDictionary<TKey, TValue>)的标准实现

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

  • 我想我的困惑点在于“IDictionary”的枚举器使用“DictionaryEntry”,而具体的“Dictionary&lt;string, int&gt;”(例如)将使用“KeyValuePair&lt;string, int&gt;” (与“DictionaryEntry”无关)。因此,行为实际上取决于您迭代的字典变量的特定转换。 (2认同)
  • @JosephHumfrey认为这种混乱是可以理解的.这是因为`GetEnumerator的显式实现.如果你没有转换为`IDictionary` - 那么你将无法在`foreach`中使用`DictionaryEntry` (2认同)

JLR*_*she 7

您缺少的一点是,如果您迭代一个IDictionary. 它们实际上可以是任何东西。唯一的保证是它实现.GetEnumerator().

如果要遍历 的内容IDictionary,可以遍历其键:

foreach (object key in myIDictionary.Keys)
{
    object value = myIDictionary[key];

    // do something with key and value
}
Run Code Online (Sandbox Code Playgroud)

您还可以将您的转换IDictionary为 aDictionary<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)
{

}
Run Code Online (Sandbox Code Playgroud)

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

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())
{
}
Run Code Online (Sandbox Code Playgroud)