使用LINQ Select扩展方法后的项目顺序

Joh*_*ogo 6 .net c# linq

可能重复:
使用LINQ保留顺序

假设我有以下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 },
};
Run Code Online (Sandbox Code Playgroud)

我使用以下LINQ 扩展方法Age从数组中提取,PersonSelect

var ages = persons.Select(p => p.Age).ToArray;
Run Code Online (Sandbox Code Playgroud)

LINQ是否保证派生数组中项的顺序与源数组中项的顺序匹配,以使ages数组按以下顺序排列?

40
30
35
Run Code Online (Sandbox Code Playgroud)

zim*_*nen 10

LINQ to Objects操作符实际上并未更改其原始数据源 - 它们构建了由数据源有效支持的序列.改变排序的唯一操作是OrderBy/OrderByDescending/ThenBy/ThenByDescending - 即使这样,那些对于同等排序的元素也是稳定的.当然,许多操作会过滤掉一些元素,但返回的元素将按相同的顺序排列.

来自Jon Skeet的答案.

返回IEnumerable的每个操作的细分在同一问题中进一步下降:https: //stackoverflow.com/a/204777/128217


Tom*_*zzo 6

Select()保留订单。完全可以。使用时请小心Distinct()ToDictionary()ToLookup()