C# LINQ扩展方法是否保证保持顺序?

C# LINQ扩展方法是否保证保持顺序?,c#,linq,C#,Linq,如果我有发布/订阅体系结构中的消息列表,我认为使用IEnumerable是合理的。在基础列表中,如果要检索特定消息并信任消息的顺序?对于Linq to Objects/IEnumerable这是正确的-将维护顺序-对于IQueryable提供程序,它取决于提供程序,许多提供程序不维护顺序 看起来这一事实(维护顺序)在MSDN上没有被记录,所以我认为它是一个实现细节,虽然不太可能在将来改变。 > >枚举。在哪里,扩展方法,但是可查询。在哪里,扩展方法将不会。 可枚举。其中必须保留顺序,因为它对结果

如果我有发布/订阅体系结构中的消息列表,我认为使用IEnumerable是合理的。在基础列表中,如果要检索特定消息并信任消息的顺序?

对于Linq to Objects/
IEnumerable
这是正确的-将维护顺序-对于
IQueryable
提供程序,它取决于提供程序,许多提供程序不维护顺序


看起来这一事实(维护顺序)在MSDN上没有被记录,所以我认为它是一个实现细节,虽然不太可能在将来改变。<> > >枚举。在哪里,扩展方法,但是<代码>可查询。在哪里,<代码>扩展方法将不会。

可枚举。其中
必须保留顺序,因为它对结果进行流式处理,并且没有缓存(缓存结果中也没有逻辑)


Queryable.Where
,另一方面,将给定的调用转换为底层数据源将理解的内容,并且无法保证排序的正确性。在使用关系数据库时,可以很容易地观察到这种效果。添加
where
子句可以让数据库选择另一个索引,这可以更改结果的顺序。如果没有明确的
order by
子句,所选索引通常会确定结果的顺序。

事实上,LINQ to Entities在
.Where()
之后记录为不保留顺序,而
可枚举。Where
当前保留顺序,我在接口文档中没有看到任何东西可以保证它会成功。当然,如果您使用的是
ParallelEnumerable
@Jim:我同意
Enumerable的文档。如果
没有声明它将保持顺序,但我认为可以安全地假设它将始终保持顺序,因为这仍然是许多开发人员依赖的一个相当大的行为变化。请注意,实际上没有任何像
IEnumerable.Where
这样的方法。有一个
可枚举。其中
扩展方法接受一个
IEnumerable
。但是,对于给定的可枚举类型,给定的LINQ查询完全可能使用不同的东西!它可以以保序或非保序的方式实现。我知道它不是一个成员,而是一个扩展方法。编写起来更简单,我假设每个人都知道linq扩展方法。请记住,给定的可枚举类型可能会定义自己的
Where()
方法,该方法可以用来代替
enumerable.Where()
,根据要枚举的引用的类型,
IEnumerable
的接口是否有文档记录以保持顺序?或者我们只是“知道”它会吗?@Jim,
IEnumerable
根本没有
Where
。它是一种扩展方法和查询模式,但不是接口的成员。@CraigStuntz:好的<代码>可枚举。其中
,然后。我没有看到文件说它会维持秩序。