在 C# 中,将使用保留元素顺序Select()
来投影元素吗?IOrderedEnumerable
- 如果是这样,它怎么会返回一个
IEnumerable
,而不是一个IOrderedEnumerable
? - 如果没有,我该如何实现(除了使用
foreach
)?
请注意,这个问题不是这个问题的重复-我只有一个Select()
子句,没有Distinct()
.
编辑
是的,它是 LINQ to Objects。顺便说一句,如果我实际上是在查询一些 SQL DB,答案会有所不同吗?
在 C# 中,将使用保留元素顺序Select()
来投影元素吗?IOrderedEnumerable
IEnumerable
,而不是一个IOrderedEnumerable
?foreach
)?请注意,这个问题不是这个问题的重复-我只有一个Select()
子句,没有Distinct()
.
编辑
是的,它是 LINQ to Objects。顺便说一句,如果我实际上是在查询一些 SQL DB,答案会有所不同吗?
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>
。有序集合现在是迭代器的来源,但不是迭代器本身。