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

时间:2013-01-17 13:42:08

标签: c# .net linq

  

可能重复:
  Preserving order with 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 },
};

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

var ages = persons.Select(p => p.Age).ToArray;

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

40
30
35

5 个答案:

答案 0 :(得分:10)

  

LINQ to Objects运算符实际上并未更改其原始数据源 -       它们构建了由数据源有效支持的序列。唯一的       更改排序的操作是OrderBy / OrderByDescending / ThenBy /       ThenByDescending - 即便如此,那些对于同等有序元素也是稳定的。       当然,很多操作会过滤掉一些元素,但其中的元素       退回的将是相同的顺序。

来自Jon Skeet's answer here

在同一个问题中,返回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);
        }
    }
}