代码之家  ›  专栏  ›  技术社区  ›  Oren Mazor

C订单保存数据结构

  •  26
  • Oren Mazor  · 技术社区  · 15 年前

    奇怪的是,msdn没有关于数据结构的保序属性的信息。所以我一直假设:

    • hashtable和hashset不保留插入顺序(也称为“hash”,其中有一个赠品)
    • 字典和列表确实保留插入顺序。

    我由此推断,如果我 Dictionary<double,double> foo 它定义了一条曲线,foo.keys.tolist()和foo.values.tolist()会给我一个该曲线范围和域的有序列表,而不会弄乱它?

    3 回复  |  直到 15 年前
        1
  •  36
  •   Leniel Maccaferri    12 年前

    您不应该期望在常规的 Dictionary<TKey,TValue> 以任何顺序维护。在一个 SortedDictionary<TKey,TValue> 键和值按键的值顺序维护。- 这与插入顺序不同 .

    .NET框架中唯一保留插入顺序的内置字典是 System.Collections.Specialized.OrderedDictionary . 不幸的是,这个类不是通用的——但是,围绕它编写一个通用包装器并不难。在处理价值类型(如 int double )它将导致键/值的装箱(通用字典不会对值类型强制装箱)。

        2
  •  -1
  •   JaredPar    15 年前

    正如@anton指出的 Dictionary<TKey,TValue> 是无序集合。正确返回值是巧合,最终会失败。如果你需要一个有序的哈希表,你应该使用 SortedDictionary<TKey,TValue>

        3
  •  -6
  •   Kurt Nørre    14 年前

    无论如何,依靠 Dictionary<TKey, TValue> 为了保持秩序!

    同时 字典<tkey,tvalue> 显然,枚举顺序是未定义的,我们测试了它确实保留了插入顺序(至少在不从中删除项的情况下)。如果有人能提供一个可以推翻它的测试,我们将非常感兴趣,因为我们的生产代码依赖于它。

    你也可以采取同样的方法,为自己和你的客户节省一些钱。

    当然,Microsoft可能会在将来的.NET版本中更改字典实现,但是如果发生这种情况,您的自动测试将检测到它,并且您可以在那时用另一个容器替换字典,对吗?