10

可能重复:
使用 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从 的数组中提取 ,PersonSelect

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

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

40
30
35
4

5 回答 5

12

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

来自Jon Skeet 的回答

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

于 2013-01-17T13:45:39.403 回答
6

Select()保持秩序。完全可以。Distinct()使用,ToDictionary()和时要小心ToLookup()

于 2013-01-17T13:45:44.313 回答
2

这会因您使用的对象和扩展方法而有所不同。这是一篇简要介绍类型以及您可以期待什么的帖子:Preserving order with LINQ

于 2013-01-17T13:44:48.347 回答
1

当然!

项目按照它们在列表中的顺序进行处理。

于 2013-01-17T13:45:46.880 回答
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);
        }
    }
}
于 2013-01-17T13:51:44.293 回答