2011-02-15 92 views
3
//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 
    } 
} 

我认为这会奏效,但显然它没有。那么,我如何才能访问包含在我的词典的价值中的类?如何使用迭代器获取字典的键/值?

+0

是Iterator势在必行?你可以用`foreach`循环很容易地做到这一点。 – 2011-02-15 20:49:49

回答

7

问题是您依赖的非通用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循环而不是自己搞乱枚举器。
+0

@David Yaw:对,是吗?正如你所看到的,我从KVP中分别获得了关键和价值。 – Ani 2011-02-15 20:58:00

2
foreach(KeyValuePair<string, cAsso> kvp in mDico) 
{ 
    // kvp.Key is string 
    // kvp.Value is cAsso 
} 
0
foreach (var kvp in mDico) 
{ 
    var asso = kvp.Value; 
    ... 
}