假设我有以下Person
类,它进一步用于声明Person
的数组:
public class Person
{
public int Id { get;set; }
public string Name { get; set; }
public int Age { get; set; }
}
var persons = new[] {
new Person { Id = 1, Name = "John", Age = 40 },
new Person { Id = 2, Name = "John", Age = 30 },
new Person { Id = 3, Name = "John", Age = 35 },
};
我使用以下LINQ Age
扩展方法从Person
数组中提取Select
,
var ages = persons.Select(p => p.Age).ToArray;
LINQ是否保证派生数组中项目的顺序与源数组中项目的顺序相匹配,以使ages
数组按以下顺序排列?
40
30
35
答案 0 :(得分:10)
LINQ to Objects运算符实际上并未更改其原始数据源 - 它们构建了由数据源有效支持的序列。唯一的 更改排序的操作是OrderBy / OrderByDescending / ThenBy / ThenByDescending - 即便如此,那些对于同等有序元素也是稳定的。 当然,很多操作会过滤掉一些元素,但其中的元素 退回的将是相同的顺序。
在同一个问题中,返回IEnumerable的每个操作的细分进一步下降:https://stackoverflow.com/a/204777/128217
答案 1 :(得分:5)
Select()
保留订单。它完全是。
使用Distinct()
,ToDictionary()
和ToLookup()
时要小心。
答案 2 :(得分:2)
这会因您使用的对象和扩展方法而有所不同。这是一篇文章,介绍了各种类型以及您可以期待的内容:Preserving order with LINQ
答案 3 :(得分:1)
当然!
项目按照列表中的顺序进行处理。
答案 4 :(得分:0)
大部分选择采用可枚举,并按顺序对每个元素应用操作。
你可以这样想:
public static class Linq
{
// We take in some data structure that supports enumeration and some function to apply to each element.
public static IEnumerable<TResult> Select<T, TResult>(this IEnumerable<T> source, Func<T, TResult> operation)
{
foreach (var item in source)
{
// Here we simply return the next element
// when the caller wants an item.
yield return operation(item);
}
}
}