【问题标题】:Fastest way to convert a Dictionary<K,V> to List<V>将 Dictionary<K,V> 转换为 List<V> 的最快方法
【发布时间】:2016-04-25 08:51:31
【问题描述】:

在 c# 中,将大约 100 个条目的字典转换为列表的最快方法是什么?我目前正在使用

myDictionary.Values.ToList();

但是当我查看 Values 属性的源代码时,它似乎创建了字典的副本,这似乎很慢。我不需要副本,有没有最快的方法?

[__DynamicallyInvokable]
    public Dictionary<TKey, TValue>.ValueCollection Values
    {
      [__DynamicallyInvokable] get
      {
        if (this.values == null)
          this.values = new Dictionary<TKey, TValue>.ValueCollection(this);
        return this.values;
      }
    }

【问题讨论】:

  • 如果您只有 100 个项目,那么性能真的是个问题吗?
  • 与其猜测它“看起来很慢”,您是否执行了任何基准测试来比较实际性能与您的要求?
  • 你如何使用你想要获取的列表?也许不同的类型最适合您,例如 IEnumerable&lt;V&gt;ICollection&lt;V&gt;

标签: c# performance list dictionary


【解决方案1】:

它不会创建字典的副本,它只是创建一个嵌套在Dictionary&lt;TKey, TValue&gt; 中的类的实例,即Dictionary&lt;TKey, TValue&gt;.ValueCollection-class。作为输入,constructor 使用字典来读取它的值。如前所述,这是一个 O(1) 操作。

Enumerable.ToList 将从这些值创建一个新列表。在我看来,这种方法是有效且可读的。通过使用ToList,您可以将值与字典本身分离,这似乎是需要的。

【讨论】:

    【解决方案2】:

    我认为这会有所帮助:

    var list= new List<V>(myDictionary.Values);
    

    【讨论】:

    • 我看不出这比 var list = myDictionary.Values.ToList() 更好
    • 更具体地说,OP 担心 期间 myDictionary.Values 发生的分配;所以既然你还在调用相同的操作......
    猜你喜欢
    • 2018-11-23
    • 1970-01-01
    • 2019-01-23
    • 1970-01-01
    • 2011-12-02
    • 2013-04-13
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    相关资源
    最近更新 更多