如何使用迭代器获取Dictionary的键/值?

时间:2011-02-15 20:47:45

标签: c# dictionary

//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 个答案:

答案 0 :(得分:8)

问题在于您依赖于非通用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. 正如Davide Piras指出的那样,在大多数情况下,你只需要一个正常的foreach循环,而不是自己搞乱调查员。

答案 1 :(得分:2)

foreach(KeyValuePair<string, cAsso> kvp in mDico)
{
    // kvp.Key is string
    // kvp.Value is cAsso
}

答案 2 :(得分:0)

foreach (var kvp in mDico)
{
    var asso = kvp.Value;
    ...
}