c# - IEnumerable 和顺序

标签 c# .net collections ienumerable

我对 IEnumerable 中的order 有疑问。

据我所知,遍历IEnumerable是伪代码,可以写成下面的方式:

while (enumerable.HasNext())
{
    object obj = enumerable.Current;
    ...
}

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

换句话说:IEnumerable 的合约是否对一般顺序做出任何保证?

因此,IEnumerable 不是保证排序的通用接口(interface)的正确方法。新的问题是什么接口(interface)或类应该用于有顺序的不可变集合? 只读集合列表?它们都包含Add()方法(前者甚至没有实现)。

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

我知道 LINQ First(),但是如果 IEnumerable 只字不提它的顺序,那么这个扩展就没用了。

最佳答案

IEnumerable/IEnumerable<T>不保证顺序,但使用 IEnumerable/IEnumerable<T> 的实现可能会或可能不会保证订购。

例如,如果您枚举 List<T> ,顺序是有保证的,但是如果你枚举 HashSet<T>没有提供这样的保证,但两者都将使用 IEnumerable<T> 进行枚举。界面。

关于c# - IEnumerable 和顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10409893/

相关文章:

c# - 比较位图列表中图像的最佳方法是什么

c# - 有没有办法用测试数据创建一个类型的实例?

c# - 使用 Linq 确定一个类中是否有超过 2 个不同的项目

.net - 在Dockerfile复制命令上找不到项目文件

java - java中存储表格以供引用

javascript - ASP MVC 集合编辑

c# - 使用不安全与安全 C# 代码的优势是什么?

c# - UWP AcrylicBrush 向后兼容最低版本 14393(周年更新)

c# - 'ObjectContext' 不包含 'Entry' 的定义并且没有扩展方法 'Entry'

java - 创建集/列表