【问题标题】:C# Dictionary - Does adding same set of keys in the same order every time guarantees to be kept in the same order(whatever the order is) every time?C# Dictionary - 每次都以相同的顺序添加相同的键集是否保证每次都保持相同的顺序(无论顺序是什么)?
【发布时间】:2020-03-31 13:55:27
【问题描述】:

按相同的顺序,我不是指添加键的相同顺序!

说,

1) 我有一本字典 d

2) 我添加 2、4、6 作为我的键

  • d.Add(2, "")
  • d.Add(4, "")
  • d.Add(6, "")

3) 现在我通过 d.Keys 属性访问它

  • 比如说,它以 4、2、6 的顺序返回键

现在我的意思是,如果我继续重复步骤 2 和 3。

d.Keys 是否总是以相同的顺序 4、2、6 返回键。

考虑到每次都以相同的顺序添加相同的一组键 (2,4,6)!

基本上在字典中添加键是一个确定性过程

我已经运行了几个示例随机案例,似乎 Dictionary.Keys 属性 每次都为同一组键返回相同的序列。

但它是否保证

我尝试过的示例代码

public static void Main(string[] args)
        {
            var rand = new Random();
            var fixedKeys = Enumerable.Range(1, 100000).Select(x => rand.Next(10000000)).Distinct().ToList();

            var dic = new Dictionary<int, string>();

            foreach (var item in fixedKeys)
            {
                dic.Add(item, "");
            }

            var fixedSequence = dic.Keys;

            for (int j = 0; j < 10; j++)
            {
                dic = new Dictionary<int, string>();

                foreach (var item in fixedKeys)
                {
                    dic.Add(item, "");
                }

                if (!dic.Keys.SequenceEqual(fixedSequence))
                {
                    Console.WriteLine("Order changed");
                }
            }
        }

【问题讨论】:

标签: c#


【解决方案1】:

来自documentation

备注

Dictionary&lt;TKey,TValue&gt;.KeyCollection 中键的顺序未指定,但与 Values 属性返回的 Dictionary&lt;TKey,TValue&gt;.ValueCollection 中关联值的顺序相同。

不保证键的顺序是任意的。

【讨论】:

  • 我更新了我的问题以解释我所说的顺序。
  • 我的答案没有改变。键的顺序未指定。 当前的实现可能会以某种方式表现,但你不能依赖于这种行为会持续到未来。
  • 文档中可能未指定,但如果您只添加到字典中,则顺序将 100% 相同。当您添加和删除该订单时,它会变得不一致。就像文档说的那样,你在编写代码时不应该指望排序,但如果你只添加不管,顺序将是相同的。
  • @Josh if you only add to the dictionary the order will be the same 100% of the time 这就是它目前的实现方式。未来不存在此类保证。您不能仅仅因为 当前 的工作方式而依赖 未指定 行为,就好像它背后有某种保证一样。
  • @josh as if the implementation for Dictionary is ever actually going to change. 这就是保证的意义所在。我们没有这样的保证。 “保证”一词被定义为“将满足某些条件的正式承诺或保证(通常以书面形式)”。在这种情况下我们有这样的保证吗?
【解决方案2】:

不,不能保证密钥会按任何顺序返回。

如果您需要此属性,您可能需要查看SortedDictionary

【讨论】:

    【解决方案3】:

    无法保证。 Dictionary 是一个哈希表,它的概念并不强制读取与写入的顺序相同。 字典中元素的顺序是不确定的。

    出于枚举的目的,字典中的每个项目都被视为 一个 KeyValuePair 结构,表示一个值及其 钥匙。返回项目的顺序未定义。

    https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.dictionary-2?redirectedfrom=MSDN&view=netframework-4.8

    https://stackoverflow.com/a/4007787/194717

    【讨论】:

      猜你喜欢
      • 2019-05-01
      • 2013-08-20
      • 1970-01-01
      • 2011-09-29
      • 2017-01-05
      • 2015-04-21
      • 2020-11-01
      • 2020-02-14
      相关资源
      最近更新 更多