假设编写了一个方法,希望将排序列表作为其输入之一。 当然这将在代码中进行评论和记录,param将被命名为“sortedList”,但如果有人忘记了,那么就会出现错误。
有没有办法FORCE输入必须排序? 我正在考虑创建一个带有列表和布尔“已排序”的新对象类,并且传递的对象必须是该对象,然后该方法立即检查“sorted”布尔值是否为真。但我觉得必须有一个更好/更标准的方式。
*此方法在循环中调用,因此不希望在方法内部进行排序。
答案 0 :(得分:4)
假设您只需要迭代此集合,而不执行任何其他操作,您可以接受IOrderedEnumerable
,这将要求序列已由某事排序。 (请记住,这样做可能意味着它是根据您预期的其他标准进行排序的,因此,根据您在内部使用的标准,数据仍然无法排序。)
您拥有的另一个选项是在收到数据后对数据进行简单排序,而不是要求调用者对数据进行排序。请注意,对于大多数常见的排序算法,对已排序的数据集进行排序是其最佳案例速度(通常为O(n)而不是O(n * log(n))),因此即使数据集有时已经排序,有时也不会只要你没有庞大的数据集,它就不一定可怕。
答案 1 :(得分:2)
首先,让我们回答这里提出的问题。
有没有办法FORCE必须对输入进行排序?
嗯,是的,不是。您可以指定需要.NET中具有排序顺序的数据结构之一。另一方面,不,您不能指定它使用您关心的排序顺序。因此,它可以按随机数排序,这与您的上下文中的“未排序”(可能)相同。
让我对此进行扩展。有一种没有方式可以声明一种类型或方法,要求编译器可以验证传递给方法的数据是否按照您决定的某些规则进行排序。根本没有一种语法允许您声明这样的要求。您要么信任调用代码,要么正确排序数据。
那你还剩下什么?
我的建议是创建一个方法,其中调用代码会告诉您数据已根据调用该方法的某些预定义要求进行了排序。如果来电者说“不,我没有或不能保证数据符合该排序顺序”,那么您将不得不自行排序。
除此之外,您可以创建自己的数据结构,这意味着正确的排序类型。
答案 2 :(得分:1)
可以在more powerful type systems中表达和强制执行此类约束,但不能在C#或.NET的类型系统中表达和实施。您可以按照建议以某种方式标记集合,但这并不能确保集合实际排序。您可以使用建议的布尔标志或特殊的类或接口。
就个人而言,我不会尝试以这种方式强制执行,但要么在运行时检查集合的排序是否花费O(n)
时间。如果你正在迭代集合,那么很容易在每次迭代中检查当前值是否大于最后一个并且如果违反了这个条件则抛出异常。
另一种选择是使用在排序列表上的O(n)
中运行的排序算法,并且每次都对集合进行排序。在列表确实已经排序的情况下,这将增加不多的开销,但如果不是,它仍然可以工作。 Insertion sort具有在排序列表中的O(n)
中运行的必需属性。 Bubble sort也拥有该属性,但在其他情况下确实很慢。