当我使用LINQ Where子句时,返回的项目列表是否遵守它们在原始列表中的顺序?
答案 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提供程序通常不会。