Как перебирать ключи и значения "IDictionary"?

Как бы я перебирал ключи и значения IDictionary если я не знаю конкретных типов ключей и значений внутри, поэтому хочу просто рассматривать их как object s?

Если я сделаю что-то вроде:

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

Я думаю, что x - object. Но как бы получить из него Key и Value (оба введенные как object s), как указано в IDictionaryEnumerator? Нет ли IKeyValuePair без общих параметров?

Думаю, я мог бы перебирать перечислитель вручную с помощью MoveNext т.д., Но я чувствую, что должен быть способ сделать это с помощью foreach !

+3
источник поделиться
2 ответа

Вы можете явно указать тип пары DictionaryEntry в foreach следующим образом:

foreach (DictionaryEntry x in myIDictionary)

Хотя вы должны быть уверены, что это стандартная реализация IDictionary (например, Hashtable или Dictionary<TKey, TValue>)

В противном случае это может быть буквально все в перечислителе.

+9
источник

То, что вам не хватает, заключается в том, что нет никаких гарантий того, каким будет тип значений, если вы выполните итерацию 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())
{
}
+1
источник

Посмотрите другие вопросы по меткам или Задайте вопрос