Как получить ключ / значение словаря с помощью итератора? - PullRequest
3 голосов
/ 15 февраля 2011
//mDIco is a Dictionnary with string as keys and homemade class (cAsso) as values
IEnumerator iterdico = mDico.GetEnumerator();

iterdico.Reset();

while (iterdico.MoveNext())
{
    var asso = iterdico.Current as cAsso;
    if (asso != null)
    {
        //Code
    }
}

Я думал, что это будет работать, но, очевидно, это не так.Итак, как мне получить доступ к классу, который содержится в значении моего словаря?

Ответы [ 3 ]

8 голосов
/ 15 февраля 2011

Проблема в том, что вы полагаетесь на неуниверсальный интерфейс IEnumerator, который не раскрывает реальный тип элемента (его свойство Current имеет тип object).Вместо этого используйте универсальный интерфейс (IEnumerator<T>, который делает тип элемента легко обнаруживаемым), и все будет в порядке.

Конечно, вам не нужно никаких особых усилийза это.Класс Dictionary<,> реализует интерфейс IEnumerable явно .Его «неявный» метод GetEnumerator возвращает перечислитель со строгой типизацией (вложенный тип, реализующий универсальный интерфейс), чего мы и хотим.

Так что можно использовать неявную типизацию полностью икомпилятор разбирается.

// Actually a Dictionary<string, cAsso>.Enumerator
// which in turn is an IEnumerator<KeyValuePair<string, cAsso>>
using(var iterdico = mDico.GetEnumerator())
{
   while (iterdico.MoveNext())
   {
       // var = KeyValuePair<string, cAsso>
       var kvp = iterdico.Current;

       // var = string
       var key = kvp.Key;

       // var = cAsso
       var value = kvp.Value;
       ...
   }
}

РЕДАКТИРОВАТЬ:

Несколько других периферийных точек:

  1. В общем, вы должны Dispose перечислителей, как правило,с блоком using.
  2. Использование метода Reset на счетчиках не рекомендуется.На самом деле, в данном конкретном случае это бесполезно.
  3. Обратите внимание, что тип элемента перечислителя - это ключ-значение пара , а не само значение.если вас интересуют только значения, перечислите последовательность, возвращаемую свойством Value словаря.
  4. Как указывает Давиде Пирас, в большинстве случаев вам просто нужен обычный цикл foreach вместо вознис счетчиком самостоятельно.
2 голосов
/ 15 февраля 2011
foreach(KeyValuePair<string, cAsso> kvp in mDico)
{
    // kvp.Key is string
    // kvp.Value is cAsso
}
0 голосов
/ 15 февраля 2011
foreach (var kvp in mDico)
{
    var asso = kvp.Value;
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...