LINQ Where子句是否遵守命令?

时间:2012-03-28 15:06:54

标签: linq ienumerable where-clause

当我使用LINQ Where子句时,返回的项目列表是否遵守它们在原始列表中的顺序?

3 个答案:

答案 0 :(得分:3)

这取决于被查询的集合如何实现其GetEnumerator。如果GetEnumerator按照添加的顺序遍历集合,那么它将遵循订单。

更新

这是我与LINQPad一起放的一个例子:

var items = new List<int>() { 1,2,3,4,5 };
items.Insert(3, 100);

(from i in items
 where i > 2
 select i).Dump();

结果:

3 
100
4
5

因此,Where子句遵循列表中项目的顺序,因为List的GetEnumerator从列表中的第一项开始并一直到最后。

答案 1 :(得分:2)

订单IEnumerable<T>中的处理项目的位置。如果您查询IEnumerable<T>的实现,它们保持插入的顺序(例如List<T>),那么您保留顺序。例如,如果您查询HashTable<T>,则无法保证订单。

答案 2 :(得分:1)

LINQ where子句被转换为Where()方法的调用。如果您的列表实现IEnumerable<T>并且没有更好的Where()方法(在大多数情况下没有),则表示调用了the extension method Enumerable.Where()

奇怪的是,该方法没有记录为按顺序返回项目,但这就是它在实践中的作用,我认为你可以依赖它。

如果对于相关集合,使用了Where()的其他一些实现(最值得注意的是,对于IQueryable<T>,它是Queryable.Where()),您将不再拥有此保证where 1}}不必遵守任何秩序。例如,SQL提供程序通常不会。