如何用Iterator获得一个Dictionnary的键/值?

//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
    }
}

我认为这会起作用,但显然它没有。 那么,我如何才能访问包含在我的词典的价值中的类?


问题在于你依赖的是非泛型的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;
       ...
   }
}

编辑:

其他一些外围要点:

  • 一般来说,您应该Dispose枚举器,通常使用一个using块。
  • 不建议在枚举器上使用Reset方法。 事实上,在这种特殊情况下,它是无用的。
  • 请注意,字典枚举器的元素类型是一个键值对,而不是值本身。 如果您只对这些值感兴趣,请枚举字典的Value属性返回的序列。
  • 正如Davide Piras所指出的,在大多数情况下,您只需要一个普通的foreach循环,而不是自己搞乱枚举器。

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

    foreach (var kvp in mDico)
    {
        var asso = kvp.Value;
        ...
    }
    
    链接地址: http://www.djcxy.com/p/30401.html

    上一篇: How do I get key/value of a Dictionnary with an Iterator?

    下一篇: How to iterate through keys and values of an `IDictionary`?