LINQ Where条款遵守订单吗?

LINQ Where条款遵守订单吗?,linq,ienumerable,where-clause,Linq,Ienumerable,Where Clause,当我使用LINQ Where子句时,返回的项目列表是否遵循它们在原始列表中的顺序?这取决于所查询的集合如何实现其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

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

这取决于所查询的集合如何实现其
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();

因此,Where子句尊重列表中项目的顺序,因为列表从列表中的第一个项目开始,一直到最后。

Where按照IEnumerable的顺序处理项目。如果查询保持插入顺序的
IEnumerable
实现(例如
List
),则保留顺序。例如,如果查询一个
哈希表
,则不能保证顺序

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

奇怪的是,这种方法并没有被记录为按顺序返回项目,但实际上它就是这样做的,我认为你可以信赖它


如果对于所讨论的集合,使用了
Where()
的其他实现(最明显的是,对于
IQueryable
,它是),则您不再有此保证,并且
Where
不必遵守任何形式的订单。例如,SQL提供程序通常不这样做。

您可以发布一些代码吗?以及所需的输出?问题不在于项目添加到列表中的顺序,而在于它们在列表中的顺序。@svick这就是为什么我认为答案涉及列表的GetEnumerator实现。列表的GetEnumerator将从集合中的第一项开始,然后按顺序进行到结束。因此,列表的顺序将通过调用
Where
返回。这个问题有点模糊,所以我的回答有点笼统。
List
不一定会按插入的顺序保留项目。如果您只使用
Add()
,它就会这样做,但是还有其他的插入方法,比如
insert()
@svick:嗯,有点像。Insert允许您在列表中的任何位置插入,但这不会更改其他元素的顺序。当然,如果一个人真的在任何时候都需要一个有序的列表,他会使用
SortedList
,但这里的重点是关于方法在哪里迭代
3 
100
4
5