【问题标题】:Is it possible to provide an ordering guarantee for a collection?是否可以为收藏提供订购保证?
【发布时间】:2019-02-05 19:07:42
【问题描述】:

我正在尝试创建一个方法,该方法(名称除外)表明某些集合的顺序将被保留。

我考虑过SortedList,但由于需要持有密钥而将其驳回。由于类似的原因,我还解雇了其他 Sorted 类型,并且 SortedSet 由于 Linq 在您对其进行操作时返回 IEnumerable 而不是另一个 SortedSet

我不介意是否需要新类型,或者我需要以特定方式编写方法。这里的目标是强调在操作集合时保持集合输入顺序的方法。

我曾考虑添加一个自定义属性并相信它会被正确使用,但我希望找到更明确的语言。

-- 编辑

与其说是集合中元素的顺序(我可以使用IEnumerable),不如说是对输入集合的一些操作。假设我要返回数组中所有数字的根,而不是返回 (root, number)[](root, index)[] 我想返回 root[] 并让用户清楚返回数组中元素的顺序匹配输入参数中元素的顺序。

【问题讨论】:

  • ordering 是指A-Z0-9Smallest to Largest 等吗?
  • 那么,如果我添加元素 A、X、Y、B、M 和 G,是否会保留该顺序?没有排序,只保留初始排序?如果您不操作 Insert-ish 方法,标准的 List 类几乎可以做到这一点。
  • 应用您的排序并添加到队列以确保保留订单? docs.microsoft.com/en-us/dotnet/api/…
  • "SortedSet 由于 Linq 在您操作时返回 IEnumerable 而不是另一个 SortedSet。"从字面上看,这将排除任何可能的集合,无论是已经存在的,还是可能曾经存在的,因为 LINQ 方法将永远返回任何这样的集合。听起来你只需要SortedSet,就是这样。如果要使用 LINQ,您需要编写自己的方法来对该集合执行复杂查询,或者根据 LINQ 查询的结果重新创建一个新的排序集合。
  • @Symon 对于任何由比较器确定的有序集合,而不是集合本身。

标签: c# collections rank contract preserve


【解决方案1】:

不,C# 或 .Net 中没有任何内容可以让您表达和强制执行“此方法不会更改集合中元素的顺序/在迭代集合时”。

传统的期望是在迭代时保留存储在集合中的元素的顺序,除非明确命名方法/类以指示重新排序。

“不重新排序”的示例:

  • for/'foreach`
  • .Select, .First, .Take, .SelectMany, .Where
  • 不称为“SortedXxxxx”的集合的索引 - List,数组。

“重新排序”的示例

  • List.Sort, List.Reverse
  • .OrderBy, .ThenBy
  • 不保留/保证排序的类,如HashSetDictionaryOrderedDictionarySortedList

【讨论】:

  • 可能没有办法强制执行它,但是有没有办法将它传达给另一个程序员而不用将它放在方法的名称中?与其说是集合中元素的顺序(我可以使用 IEnumerable),不如说是对输入集合的一些操作。假设我要返回数组中所有数字的根,而不是返回 (root, number) 或 (root, index) 我想返回 (root) 并让用户清楚元素的顺序返回的数组中的元素与输入参数中元素的顺序相匹配。
  • 我觉得我可能对 .NET 要求太多了。
  • @Stevey 没有人会期望IEnumerable<double> SquareRoots(IEnumerable<double> input) 以不同于原始收藏的顺序返回项目。你可能想多了。
【解决方案2】:

听起来你想要queue。添加的第一个对象将是第一个删除的对象,因此保留了插入顺序。通常使用Dequeue() 方法将对象从队列中处理出来,但如果您不想从集合中移除,可以使用Peek() 方法。

除此之外,您可能还需要推出自己的实现。它可能只是List<T> 的包装,您可以在其中防止任何内容被Inserted。

【讨论】:

    猜你喜欢
    • 2020-05-25
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    • 2012-12-20
    • 2016-08-02
    • 1970-01-01
    • 2019-04-28
    • 2011-02-03
    相关资源
    最近更新 更多