【问题标题】:Navigate through dictionary <string, int> c#浏览字典 <string, int> c#
【发布时间】:2012-05-08 12:52:28
【问题描述】:

在字典中导航的更好方法是什么?当我有 IDictionary 时,我曾经使用下面的代码:

假设我的 IDictionary 名为 freq

IEnumerator enums = freq.GetEnumerator();
while (enums.MoveNext())
{
    string word = (string)enums.Key;
    int val = (int)enums.Value;
    .......... and so on

}

但是现在,我想用字典做同样的事情

【问题讨论】:

    标签: c# c#-4.0


    【解决方案1】:

    foreach 中的默认枚举器为您提供KeyValuePair&lt;TKey, TValue&gt;

    foreach (var item in dictionary)
    // foreach (KeyValuePair<string, int> item in dictionary)
    {
        var key = item.Key;
        var value = item.Value;
    }
    

    这只是编译成可以直接使用枚举器的代码,就像在旧代码中一样。

    或者你可以直接枚举.Keys.Values(但在这种情况下你只能得到一个键或一个值):

    foreach (var key in dictionary.Keys)
    
    foreach (var val in dictionary.Values)
    

    和或课程 linq 对字典起作用:

    C# linq in Dictionary<>

    【讨论】:

    • 对于使用 Var,这是否会分别影响 key 的数据类型和 string , int 的值?我对使用 var 不友好,这就是我问的原因
    • @JoneMamni: 否 - var 只是给变量一个类型,该类型是从分配值的 compile-time 类型推断出来的。在执行时没有影响。
    • @JoneMamni 不,在这种情况下,var 是从键和值的类型推断出来的,在您使用通用字典的情况下,这将是字符串和 int。
    【解决方案2】:

    可以Dictionary做同样的事情,但在两种情况中使用foreach会更简洁:

    foreach (var entry in dictionary)
    {
        string key = entry.Key;
        int value = entry.Value;
        // Use them...
    }
    

    这相当于:

    using (var iterator = dictionary.GetEnumerator())
    {
        while (iterator.MoveNext())
        {
            var entry = iterator.Current;
            string key = entry.Key;
            int value = entry.Value;
            // Use them...
        }
    }
    

    显式调用GetEnumerator 并自行迭代非常很少有用。它适用于少数情况,例如当您想以不同方式处理第一个值时,但如果您要以相同方式处理 所有 条目,请使用 foreach

    (请注意,这里实际上等同于使用var,但等同于声明IEnumerator&lt;KeyValuePair&lt;string, int&gt;&gt; - 它实际上将使用嵌套的Dictionary.Enumerator 结构。这是您的详细信息通常不需要担心。)

    【讨论】:

      【解决方案3】:

      foreach 语句自动遍历枚举器。

      foreach (KeyValuePair<string,int> entry in freq) {
          string word = entry.Key;
          int val = entry.Value;
          .......... and so on
      
      }
      

      【讨论】:

      • 那么,哪一个会更快?使用 IEnumerator 或 foreach (KeyValuePair。因为我的字典包含超过 200000 个单词。
      • foreach 在内部调用 GetEnumeratorMoveNext。所以这不应该有任何区别。此外,通用变体应该更快一些,因为不再需要铸件。尤其是int,千万不要装箱和拆箱。
      猜你喜欢
      • 2019-01-31
      • 1970-01-01
      • 2021-08-19
      • 2022-07-29
      • 2013-06-07
      • 1970-01-01
      • 2021-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多