IEnumerable和订单

und*_*ned 42 .net c# collections ienumerable

我有一个关于这个问题顺序IEnumerable.

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

while (enumerable.HasNext())
{
    object obj = enumerable.Current;
    ...
}
Run Code Online (Sandbox Code Playgroud)

现在,假设,需要对已排序的集合进行操作.可以在这种情况下使用IEnumerable,还是尝试IList使用索引支持的其他方法(即)?

换句话说:合同是否IEnumerable一般对订单作出任何保证?

因此,IEnumerable对于保证排序的通用接口而言,这不是一个合适的方法.新的问题是什么接口或类应该用于带有顺序的不可变集合?ReadonlyCollectionIList?它们都包含Add()方法(甚至没有在前者中实现).

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

我知道LINQ First(),但如果IEnumerable不说一下它的排序,这个扩展是没用的.

spe*_*der 38

IEnumerable/IEnumerable<T>不保证订购,但使用的实施IEnumerable/IEnumerable<T>可能会或可能不会保证订购.

例如,如果您枚举List<T>,则保证订单,但如果您枚举HashSet<T>没有提供此类保证,则两者都将使用该IEnumerable<T>接口进行枚举.


小智 13

实施细节.IEnumerable将枚举该项 - 实现方式取决于实现.MOST列表等按其自然顺序运行(索引0向上等).

在一般情况下,IEnumerable的合同是否保证了我们的订单?

不,它只保证枚举(每个项目一次等).IEnumerable没有保证订单,因为它也可用于无序项目.

我知道LINQ First(),但是如果IEnumerable没有说出它的顺序,那么这个扩展是没用的.

不,它不是,因为你可能有内在的秩序.您给SQL作为示例 - 结果是IEnumerable,但如果我之前已经强制执行排序(通过使用OrderBy()),则按照LINQ的定义对IEnumerable进行排序.AsEnumerable().First()通过Order获取第一个项目.


Mar*_*age 6

也许您正在寻找IOrderedEnumerable接口?它由扩展方法返回,OrderBy()并允许后续排序ThenBy().

  • 不幸的是,如果您想接受像IList这样的接口来保证订单但不从IOrderedEnumerable继承,那么这将不起作用.请参见http://stackoverflow.com/q/5429974/1157054 (2认同)