//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
接口(interface),它不显示真正的元素类型(它的 Current
属性是 object
类型)。使用通用接口(interface)( IEnumerator<T>
,它确实使元素类型很容易被发现),你会没事的。
当然,您不需要为此付出任何特别的努力。 Dictionary<,>
类实现了 IEnumerable
接口(interface)显式。它的“隐式”GetEnumerator
方法返回一个强类型的枚举器(实现泛型接口(interface)的嵌套类型),这正是我们想要的。
所以一直使用隐式类型并让编译器解决问题是很好的。
// 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
返回的序列属性(property)。 - 正如 Davide Piras 指出的那样,在大多数情况下,您只需要一个普通的
foreach
循环而不是自己搞乱枚举器。
关于c# - 如何使用迭代器获取字典的键/值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5009308/