一尘不染

使用LINQ保留订单

c#

我在有序数组上使用LINQ to Objects指令。我不应该执行哪些操作来确保数组的顺序不变?


阅读 235

收藏
2020-05-19

共1个答案

一尘不染

我检查了System.Linq.Enumerable的方法,丢弃了所有返回非IEnumerable结果的方法。我检查了每个注释,以确定结果的顺序与源顺序之间的差异。

绝对保留订单。您可以按索引将源元素映射到结果元素

  • 无数
  • 康卡特
  • 选择
  • 数组
  • 到清单

保留订单。元素被过滤或添加,但不重新排序。

  • 不同
  • 除了
  • 相交
  • 类型
  • 前置(.net 4.7.1中的新功能)
  • 跳跃
  • 跳过而
  • 采取
  • 哪里
  • 邮编(.net 4中的新功能)

销毁订单-我们不知道期望的订单顺序。

  • 到字典
  • 去查查看

明确地重新定义订单-使用这些来更改结果的顺序

  • 按订单
  • OrderByDescending
  • 逆转
  • 然后
  • 然后降序

根据一些规则重新定义订单。

  • GroupBy-根据产生每个IGrouping第一个键的源中元素的顺序,按顺序产生IGrouping对象。分组中的元素按它们在源中出现的顺序产生。
  • GroupJoin-GroupJoin保留外部元素的顺序,对于外部元素,从内部匹配元素的顺序。
  • 连接-保留外部元素的顺序,对于这些元素中的每个元素,保留内部匹配元素的顺序。
  • SelectMany-对于源的每个元素,都会调用选择器,并返回一个值序列。
  • 联合-枚举此方法返回的对象时,联合将按此顺序枚举第一和第二,并产生尚未产生的每个元素。

编辑:基于此实现,我已将Distinct移至Preserving
order 。

    private static IEnumerable<TSource> DistinctIterator<TSource>
      (IEnumerable<TSource> source, IEqualityComparer<TSource> comparer)
    {
        Set<TSource> set = new Set<TSource>(comparer);
        foreach (TSource element in source)
            if (set.Add(element)) yield return element;
    }
2020-05-19