【问题标题】:Is the IEnumerator of a dictionary guaranteed to be consistent?字典的 IEnumerator 是否保证一致?
【发布时间】:2013-01-25 16:33:09
【问题描述】:

所以,我找到了这样一段代码:

class CustomDictionary
{
  Dictionary<string, string> backing;
  ...
  public string Get(int index)
  {
    return backing.ElementAtOrDefault(index); //use linq extensions on IEnumerable
  }
}

然后这样使用:

for(int i=0;i<mydictionary.Count;i++)
{
  var value=mydictionary.Get(i);
}

除了这样做的性能问题和丑陋之外,这段代码真的正确吗?即,是否保证字典上的 IEnumerable 始终以相同的顺序返回事物,假设在迭代期间没有对字典进行任何修改?

【问题讨论】:

  • 我建议你反编译 Dictionary 类,因为它完全依赖于内部实现。

标签: c# .net dictionary ienumerable


【解决方案1】:

这不能保证。当然,它适用于 SortedDictionary,也适用于数组和列表。但不适用于字典。

很有可能,如果不更改字典,它将是稳定的 - 但不能保证。你必须问自己——你觉得幸运吗? ;)

【讨论】:

  • Dovie'andi se tovya sagain.. 我特别喜欢“你觉得幸运吗?”
  • SortedDictionary 不会保证您获得的项目与您用于将它们添加到数据结构中的顺序相同。它将按提供的键对项目进行排序。
  • @MiguelMatos:如果键具有明确的排名,并且既没有添加也没有删除项目,重复枚举必须返回相同顺序的所有项目(唯一正确的一项)。跨度>
  • @supercat 这取决于你想要什么样的序列。如果您希望按键对项目进行排序,或者希望按添加顺序对项目进行排序。提出问题的方式不清楚 Earlz 正在寻找哪种类型。
  • @MiguelMatos:我的解释是他不需要任何特定的序列,但他需要所有 ElementAtOrDefault 调用返回不同的项目。
【解决方案2】:

如果您想按插入顺序获取元素,那么您可能应该查看StackQueue,具体取决于您首先想要的元素。

【讨论】:

    【解决方案3】:

    是的,你会得到相同的物品。

    正如您指定的那样,您提出的方法效率非常低。

    ElementAtOrDefault 是 IEnumerable 的 LINQ 扩展方法,意味着对于每个项目,它将一直迭代到指定的项目。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-26
      • 1970-01-01
      • 2011-01-04
      • 2017-06-16
      • 2010-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多