IOrderedEnumerable.Select()会保留元素顺序吗?

时间:2013-07-15 09:05:18

标签: c# ienumerable iorderedenumerable

在C#中,是否会使用Select()投影IOrderedEnumerable保留元素顺序的元素?

  • 如果是这样,它怎么会返回IEnumerable,而不是IOrderedEnumerable
  • 如果没有,我怎样才能做到这一点(使用foreach除外)?

请注意,此问题与this one不重复 - 我只有Select()子句,没有Distinct()

修改

是的,它是对象的LINQ。 顺便说一下,如果我实际上在查询一些SQL DB,答案会有什么不同吗?

1 个答案:

答案 0 :(得分:10)

Select不会更改元素顺序。它是streaming operator (MSDN),这意味着它按照源的顺序处理源元素,并逐个生成投影元素。

因此,如果您正在对有序源进行投影,则投影结果将保留源元素的顺序。


还有一件事 - 你可能想知道为什么结果没有实现IOrderedEnumerable<T>

int[] items = { 2, 3, 1, 8, 5 };
IEnumerable<int> query = items.OrderBy(i => i).Select(i => i);
bool isOrdered = query is IOrderedEnumerable<int>; // false

这是因为Select运算符返回新的迭代器对象(在本例中为WhereSelectArrayIterator),它从源集合(在本例中为OrderedEnumerable)逐个读取项目,项目项目,并返回投影。这个新的迭代器对象没有实现IOrderedEnumerable<T>接口,它只是简单的IEnumerable<T>。有序集合现在是迭代器的源,但不是迭代器本身。