内のキーと値の具体的なタイプがわからない場合、IDictionary
のキーと値を反復処理するにはどうすればよいでしょうか。したがって、それらをobject
sとして扱いたいだけですか?
私が次のようなことをした場合:
foreach(var x in myIDictionary) { ... }
x
はobject
だと思います。しかし、Key
で指定されているように、Value
とobject
(どちらもIDictionaryEnumerator
sと入力)からどのように取得しますか?ジェネリックパラメータのないIKeyValuePair
はありませんか?
MoveNext
などを使用して手動で列挙子をループできると思いますが、foreach
を使用してそれを行う方法があるはずだと思います!
次のように、DictionaryEntry
でforeach
ペアタイプを明示的に指定できます。
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())
{
}