LINQ扩展方法在哪里可以保证保存顺序?

时间:2011-10-04 20:43:50

标签: c# linq

如果我在发布/订阅架构中有一个消息列表,我认为在底层列表上使用IEnumerable.Where来检索特定消息并信任消息的顺序是合理的吗?

2 个答案:

答案 0 :(得分:21)

Enumerable.Where扩展方法会,但Queryable.Where扩展方法不会。

Enumerable.Where必须保留顺序,因为它流式传输结果并且没有缓存(缓存结果中没有逻辑)。

另一方面,

Queryable.Where将给定的查询转换为基础数据源将理解的内容,并且无法保证所需的顺序。使用关系数据库时,可以轻松地观察到这种效果。添加where子句可以让数据库选择另一个索引,这可以改变结果的顺序。

答案 1 :(得分:7)

对于Linq to Objects / IEnumerable这是真的 - 订单将被维护 - 对于IQueryable提供商而言,它取决于提供商,许多提供商不维护订单。

看起来这个事实(维护顺序)没有在MSDN上记录,所以我认为它是一个实现细节 - 尽管不太可能 - 将来可能会改变。