Как я могу получить все KeyValuePairs, содержащиеся в Dictonary <?,?>? - PullRequest
3 голосов
/ 02 августа 2009

У меня есть объект, который представляет собой словарь неизвестного типа (т. Е. Я не знаю тип ключа и значение)

Я хочу получить все его значения, чтобы получить доступ к ним по индексу.

Так что я хочу сделать что-то вроде этого:

Dictionary<object, object> d = (Dictionary<object, object>)obj; // cast error
l = new List<KeyValuePair<object,object>>();
foreach (KeyValuePair<object, object> k in d)
   l.Add(new KeyValuePair<object,object>(k.Key, k.Value));

Однако, как и ожидалось, среда выполнения не позволит мне привести словарь в <объект, объект>.

Есть ли способ сделать это в .net 3.0? (например, используя отражение?)

Ответы [ 3 ]

15 голосов
/ 02 августа 2009

Так как Dictionary<,> реализует IDictionary (не универсальный), просто повторите это:

    IDictionary data = ...
    foreach (DictionaryEntry de in data)
    {
        Console.WriteLine(de.Key + ": " + de.Value);
    }
5 голосов
/ 03 августа 2009

Вы не можете разыграть obj до Dictionary<object, object>, потому что это не Dictionary<object, object>. Да, его ключи и значения берутся из object и могут быть преобразованы в object. Но вы не можете приводить универсальные типы в C #, потому что они не являются ковариантными. Даже если T происходит от object, List<T> не происходит от List<object>.

Рассмотрим этот метод:

void ModifyList<List<object> list)
{
   for (int i=0; i<list.Count; i++)
   {
      list[i] = list[i].ToString();
   }
}

Если бы вы могли привести List<int> к List<object>, вы могли бы передать List<int> этому методу, и он превратился бы во что-то еще.

Это изменится, когда в C # 4.0 будут введены ковариантные обобщения. Эта статья является довольно хорошим объяснением связанных с этим проблем.

Но чтобы решить вашу реальную проблему, это поможет:

List<KeyValuePair<object, object>> list = d.AsEnumerable()
   .Select(x => new KeyValuePair<object, object>(x.Key, x.Value))
   .ToList();
0 голосов
/ 02 августа 2009

возможно:

<pre> foreach (object key in d.keys) { l.Add(new KeyValuePair(key, d[key]); }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...