web-dev-qa-db-ja.com

「IDictionary」のキーと値を反復処理する方法は?

内のキーと値の具体的なタイプがわからない場合、IDictionaryのキーと値を反復処理するにはどうすればよいでしょうか。したがって、それらをobjectsとして扱いたいだけですか?

私が次のようなことをした場合:

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

xobjectだと思います。しかし、Keyで指定されているように、Valueobject(どちらもIDictionaryEnumeratorsと入力)からどのように取得しますか?ジェネリックパラメータのないIKeyValuePairはありませんか?

MoveNextなどを使用して手動で列挙子をループできると思いますが、foreachを使用してそれを行う方法があるはずだと思います!

6
Joseph Humfrey

次のように、DictionaryEntryforeachペアタイプを明示的に指定できます。

foreach (DictionaryEntry x in myIDictionary)

IDictionaryの標準実装であることを確認する必要があります(HashtableDictionary<TKey, TValue>など)

それ以外の場合は、列挙子の文字通り何でもかまいません。

15
Lanorkin

見逃している点は、IDictionaryを繰り返した場合に値のタイプがどうなるかについての保証がないということです。それらは文字通り何でもかまいません。唯一の保証は、.GetEnumerator()を実装することです。

IDictionaryの内容を反復処理する場合は、そのキーを反復処理できます。

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

    // do something with key and value
}

IDictionaryDictionary<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())
{
}
4
JLRishe