【问题标题】:Get element of HashSet<T> by position按位置获取 HashSet<T> 的元素
【发布时间】:2013-05-28 16:37:13
【问题描述】:

有没有办法从HashSet 中获取第三行?喜欢

HashSet<string> ContinuedForums = new HashSet<string>();
ContinuedForums.add("a");
ContinuedForums.add("b");
string hellow = ContinuedForums[1];

是的,我想使用HashSet

【问题讨论】:

  • 当然。枚举并抓住前两个,丢弃它们。然后抓住第三个并退出循环。这也可以使用 Linq .Skip(2).First() 来完成。如果您想要更好的方法,请使用更好的工具。另请注意,枚举顺序和插入顺序不保证匹配。
  • var value = ContinuedForums.ToList()[2]; :)
  • @Sean 谢谢!
  • 这看起来也是对数据结构的滥用
  • “第三”的标准是什么?加了第三个?第三个按排序值? “第三”对 HashSet 没有实际意义。

标签: c# hashset


【解决方案1】:

HashSet&lt;T&gt; 本质上是无序的

您可以通过ContinuedForums.Skip(2).First() 获取第三个元素,但这不一定是您添加的“第三个”元素,并且顺序会随着您添加或删除元素而改变。

如果您需要保留顺序,那么 HashSet&lt;T&gt; 可能是使用错误的集合类型。它不是为了保持顺序或按索引访问。

【讨论】:

  • +1。 OrderedDictionary 可能是要使用的数据结构。
  • @AlexeiLevenkov 也许,或者只是一个 HashSet + List 等
【解决方案2】:

如果你想平衡顺序和性能,你最好保留两个结构...... HashSet 用于 O(1) 查找和 List 用于枚举(或快速索引访问器查找)。

【讨论】:

    【解决方案3】:

    如果您在添加第三个的上下文中谈论“第三个”,那么就没有办法了。 HashSet 不会公开该信息。这是 HashSet 内部实现的一个未记录的副作用,如果您将这些字符串添加到 HashSet:“one”、“two”、“three”,如果您枚举,您将按照添加它们的顺序返回内容在其内容之上。但由于这是未记录的行为,因此编写依赖于该行为的代码将是一个大错误。原因是 HashSet 的未来版本可能会以完全不同的方式运行。另请注意,如果您要从 HashSet 中删除“二”,然后添加“四”,则对 HashSet 进行枚举可能会返回“一”、“四”、“三”。

    “位置”的整个概念是 HashSet 的内部实现细节。它在其方法和属性中没有公开任何承诺提供有关位置的信息。所以,对于HashSet的用户来说,位置的概念是不存在的。

    【讨论】:

      【解决方案4】:

      如果集合中的顺序很重要,您可以使用SortedSet

      这不会按照您添加项目的顺序为您提供项目,而是会对其进行排序。

      【讨论】:

      • MSDN 链接 do 经常死掉。但是,链接的内容并没有像这里的文字那样真正回答问题。 @FoundWaldoException:包括一个代码示例,它可以使用您推荐的库来满足 OP 的需求,这将是一个很好的答案。
      猜你喜欢
      • 2011-10-23
      • 2014-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多