【问题标题】:Order of items after using LINQ Select extension method [duplicate]使用 LINQ Select 扩展方法后的项目顺序 [重复]
【发布时间】:2013-01-01 01:40:43
【问题描述】:

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

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

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

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

40
30
35

【问题讨论】:

    标签: c# .net linq


    【解决方案1】:

    Select 在大多数情况下接受一个可枚举并按顺序对每个元素应用操作。

    你可以这样想:

    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);
            }
        }
    }
    

    【讨论】:

    • 但问题是在规范中得到保证,或者他们是否允许在未来的实施中改变这种行为?在这种情况下,是的,这与说这只是当前实现的副作用不同。
    【解决方案2】:

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

    来自Jon Skeet's answer here

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

    【讨论】:

      【解决方案3】:

      当然!

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 实际上,我在实际代码中使用了Distinct()。我应该注意什么?
        • 它不保留原来的顺序……好吧,你不能确定它会被保留,那是不同的。
        • @Zarathos Distinct 实际上保留了原始顺序(至少在当前实现中),尽管这不是文档的保证。
        • 嗯,这就是我所说的Servy:“你不能确定它会被保存”。
        • 我更喜欢直截了当的答案。
        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 2012-12-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-12
          相关资源
          最近更新 更多