我有一个关于订单在IEnumerable
(或IEnumerable<T>
,无所谓)的问题。IEnumerable和订单
我们知道,通过IEnumerable的迭代是伪代码可以通过以下方式书写:
while (enumerable.HasNext())
{
object obj = enumerable.Current;
...
}
现在,假设,一个需要在分类收集操作。在这种情况下可以使用IEnumerable还是使用支持索引的其他方法(即IList
)更好?
换句话说:IEnumerable
的合同是否对订单作出一般保证?
UPD:因此,IEnumerable
不适用于保证排序的通用接口。新的问题是什么接口或类应该用于订单不可变集合? ReadonlyCollection
? IList
?他们都包含Add()
方法(甚至没有在前者实施)。有什么建议?
P.S我自己的想法:IEnumerable
不提供任何有关订购的保证。正确的实现可以在不同枚举中以不同顺序返回相同的元素(考虑SQL查询)
P.P.S.我知道LINQ First()
,但如果IEnumerable
没有说它的排序的话,这个扩展是相当无用的。
另一个例子是'Dictionary <,>'。它清楚地记录了它的条目枚举的顺序是未定义的。因此,像'dict.Last().Key'这样的代码(其中'dict'是'Dictionary <,>'而'Last()'是LINQ扩展方法)是没有意义的。 (我听说有一位开发人员正在做这件事。) –
我想补充说,它对于正确理解什么是对某些通用集合订单的保证很重要。所以顺序保证不是关于特定的顺序(比如说,作为排序的结果),而是关于保证相同集合的元素的顺序对于随后的枚举是相同的。大多数收集不明确保证。 IList只代表一种字典,其中键是索引。 –
IOrderedEnumerable可能是一个标志,认为集合保证了顺序(虽然接口仍然没有),但它比我们需要的更多 - 它通常代表一个特定的SORT顺序,而我们需要任何(随机)顺序,这只是在枚举之间保证。总之,只有具体的实现才能真正保证顺序(例如Array,List)。 –