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
对于保证排序的通用接口而言,这不是一个合适的方法.新的问题是什么接口或类应该用于带有顺序的不可变集合?ReadonlyCollection
?IList
?它们都包含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获取第一个项目.
也许您正在寻找IOrderedEnumerable接口?它由扩展方法返回,OrderBy()
并允许后续排序ThenBy()
.
归档时间: |
|
查看次数: |
21971 次 |
最近记录: |