是否可以为集合提供订购保证?

时间:2019-02-05 19:07:42

标签: c# collections rank contract preserve

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

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

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

我曾考虑过添加一个自定义属性,只是相信它会被正确使用,但是理想情况下,我想用更明确的语言找到一些东西。

-编辑

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

2 个答案:

答案 0 :(得分:1)

不,在C#或.Net中没有什么可以让您表达和执行的:“此方法在遍历集合时不会更改集合中元素的顺序。”

常规期望是在迭代过程中保留的集合中存储的元素的顺序,除非显式命名的方法/类指示重新排序。

“不重新排序”的示例:

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

“重新排序”的示例

  • List.SortList.Reverse
  • .OrderBy.ThenBy
  • 不保留/保证顺序的类,例如HashSetDictionaryOrderedDictionarySortedList

答案 1 :(得分:0)

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

除此之外,您可能需要滚动自己的实现。它可能只是List<T>的包装,在这里您可以防止Insert修改任何内容。