C# 可数与有序

C# 可数与有序,c#,.net,collections,ienumerable,C#,.net,Collections,Ienumerable,我有一个关于IEnumerable中顺序的问题 据我所知,迭代IEnumerable是伪代码,可以用以下方式编写: while (enumerable.HasNext()) { object obj = enumerable.Current; ... } 现在,假设需要对排序后的集合进行操作。在这种情况下可以使用IEnumerable,还是最好尝试其他支持指数化的方法(即IList) 换句话说,IEnumerable的合同是否对订单做出了任何保证 因此,IEnumerable并

我有一个关于
IEnumerable
顺序的问题

据我所知,迭代IEnumerable是伪代码,可以用以下方式编写:

while (enumerable.HasNext())
{
    object obj = enumerable.Current;
    ...
}
现在,假设需要对排序后的
集合进行操作。在这种情况下可以使用IEnumerable,还是最好尝试其他支持指数化的方法(即
IList

换句话说,
IEnumerable
的合同是否对订单做出了任何保证

因此,
IEnumerable
并不是保证排序的通用接口的适当方法。新的问题是,对于具有顺序的不可变集合,应该使用什么接口或类<代码>只读集合<代码>IList?它们都包含
Add()
方法(在前一个方法中甚至没有实现)

我自己的想法是:
IEnumerable
不保证订购。正确的实现可以在不同的枚举中以不同的顺序返回相同的元素(考虑SQL查询)


我知道LINQ
First()
,但是如果
IEnumerable
没有说明它的顺序,那么这个扩展是非常无用的。

实现细节。IEnumerable将枚举该项-如何实现取决于实现。大多数列表等按照其自然顺序运行(索引0向上等)

在一般情况下,IEnumerable合同能保证我们的订单吗

不,它只保证枚举(每项一次等)。IEnumerable没有保证顺序,因为它也可用于无序项

我知道LINQ First(),但是如果IEnumerable没有说明它的顺序,那么这个扩展就毫无用处了


不,它不是,因为你可能有内在的秩序。以SQL为例-结果是IEnumerable,但如果我之前(通过使用OrderBy())强制执行了排序,那么IEnumerable将按照LINQ的定义进行排序。AsEnumerable().First()按顺序获取第一项。

IEnumerable/IEnumerable
不保证排序,但使用
IEnumerable/IEnumerable
的实现可能保证也可能不保证排序


例如,如果您枚举
列表
,顺序是有保证的,但是如果您枚举
哈希集
,则不提供这样的保证,但是这两种保证都将使用
IEnumerable
接口进行枚举。

您混合了两点:枚举和排序

当您枚举超过IEnumerable时,您不应该关心顺序。使用该接口时,其实现应该考虑顺序

例如:

void Enumerate(IEnumerable sequence)
{
    // loop
}

SortedList<T> sortedList = ...
Enumerate (sortedList);
void枚举(IEnumerable序列)
{
//环路
}
SortedList SortedList=。。。
列举(分类列表);

在方法内部,它仍然是一个具有固定顺序的列表,但方法不知道特定的接口实现及其特性。

也许您正在寻找接口?它由扩展方法返回,如
OrderBy()
,并允许随后使用
ThenBy()

进行排序另一个例子是
字典。有明确的文件证明,其条目的枚举顺序是未定义的。所以像
dict.Last().Key
(其中
dict
字典,而
Last()
是LINQ扩展方法)这样的代码毫无意义。(我听说有一个开发人员正是这样做的。)我想补充一下,我已经说过,正确理解一些通用集合的订单的保证是很重要的。因此,顺序保证不是关于特定的顺序(例如,作为排序的结果),而是关于保证相同集合的元素的顺序对于后续枚举是相同的。大多数收藏都没有明确保证这一点。IList只表示一种字典,其中键是索引。IOrderedEnumerable可能是一种迹象,表明集合保证了顺序(尽管接口仍然没有),但它超出了我们的需要-它通常表示一种特定的排序顺序,而我们需要任何(随机)顺序,这只是在枚举之间得到保证。总之,只有具体的实现才能真正保证顺序(例如数组、列表)。在主题(返回的集合)中描述的情况下,它实际上不会对向用户显示哪种类型的集合产生任何影响(除非您想更明确地声明您的合同),您只需要实际返回的类型来提供排序保证。在
List
的情况下,枚举的顺序是否得到保证?你怎么知道的?不幸的是,如果你想接受像IList这样的接口,它可以保证一个顺序,但不能从IORDerenumerable继承,那么这就行不通了。看见