c# - 如何使用迭代器获取字典的键/值?

标签 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
    }
}

我认为这行得通,但显然行不通。那么我如何才能访问包含在我的字典值中的类呢?

最佳答案

问题是您依赖于非通用 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;
       ...
   }
}

编辑:

其他一些外围点:

  1. 一般来说,你应该 Dispose枚举数,通常带有 using阻止。
  2. 使用 Reset不推荐枚举器上的方法。事实上,在这种特殊情况下,它是没有用的。
  3. 请注意,字典枚举器的元素类型是键值对,而不是值本身。如果您只对值感兴趣,请枚举字典的 Value 返回的序列属性(property)。
  4. 正如 Davide Piras 指出的那样,在大多数情况下,您只需要一个普通的 foreach循环而不是自己搞乱枚举器。

关于c# - 如何使用迭代器获取字典的键/值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5009308/

相关文章:

c# - 反序列化压缩字符串时出错(解析完成前遇到流结束)C#

python - 将两个等长列表合并成一个字典,映射一对多

c# - 将日期和时间转换为 GMT 格式

C# 列表作为字典键

c# - 从字典中检索原始 key

Python:如何创建包含字典键和值对的列表

dictionary - Hive-XML-SerDe-键/值对-映射

c# - 使用私有(private)类代替字段 - 性能/内存损失?

c# - 使用 Unity 5 UI 进行双指缩放

c# - 在 Sql 中重命名表,并相应地在 Entity Framework 中重命名表(Db First)