将IOrderedEnumerable.Select()保留元素顺序

本文关键字:保留 元素 顺序 IOrderedEnumerable Select | 更新日期: 2023-09-27 18:22:24

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

  • 如果是,为什么它返回IEnumerable,而不是IOrderedEnumerable
  • 如果没有,我该如何实现(除了使用foreach

注意,这个问题不是这个问题的重复——我只有一个Select()子句,没有Distinct()

编辑

是的,它是LINQ to Objects。顺便说一句,如果我真的在查询一些SQL数据库,答案会有什么不同吗?

将IOrderedEnumerable.Select()保留元素顺序

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

所以,若您正在进行有序源的投影,投影结果将保留源元素的顺序。


还有一件事——您可能想知道为什么result不能实现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>。有序集合现在是迭代器的来源,但不是迭代器本身。