使用LINQ保留订单

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


#1楼

您其实是在谈论SQL仍是数组? 换句话说,您是使用LINQ to SQL仍是LINQ to Objects? 数据结构

LINQ to Objects运算符实际上并无更改其原始数据源,而是创建了由数据源有效支持的序列。 惟一会更改顺序的操做是OrderBy / OrderByDescending / ThenBy / ThenByDescending-即使如此,那些操做对于相等顺序的元素也是稳定的。 固然,许多操做会过滤掉某些元素,可是返回的元素将以相同的顺序排列。 加密

若是您转换为其余数据结构(例如,使用ToLookup或ToDictionary),那么我不认为此时会保留顺序-但这仍是有些不一样。 (我相信,映射到相同键的值的顺序会保留用于查找。) spa


#2楼

若是您正在处理数组,则听起来好像您正在使用LINQ-to-Objects,而不是SQL。 你肯定吗? 大多数LINQ操做都不会从新排序任何东西(输出将与输入顺序相同)-所以,请勿应用其余排序方式(OrderBy [Descending] / ThenBy [Descending])。 .net

[编辑:正如乔恩所说的那样; LINQ一般会建立一个序列,而将原始数据保留下来] code

请注意,将数据压入Dictionary<,> (ToDictionary)将对数据进行加密,由于Dictionary不遵照任何特定的排序顺序。 对象

可是最多见的事情(选择,哪里,跳过,取走)应该没问题。 排序


#3楼

任何“分组依据”或“排序依据”均可能会更改顺序。 索引


#4楼

我检查了System.Linq.Enumerable的方法,丢弃了全部返回非IEnumerable结果的方法。 我检查了每一个注释,以肯定结果的顺序与源顺序之间的差别。 element

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

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

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

  • 不一样
  • 除了
  • 相交
  • 类型
  • 前置(.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;
    }

#5楼

我在引用官方文档的相似问题中找到了一个很好的答案。 引用一下:

对于Enumerable方法(适用于List<T> LINQ to Objects),能够依靠SelectWhereGroupBy返回的元素顺序。 对于本质上无序的事物(例如ToDictionaryDistinct ,状况并不是如此。

Enumerable.GroupBy文档中:

所述IGrouping<TKey, TElement>对象的顺序,获得基于所产生的每个第一密钥在源中的元素的顺序上IGrouping<TKey, TElement> 分组中的元素按它们在source出现的顺序产生。

对于IQueryable扩展方法(其余LINQ提供程序),不必定是正确的。

资料来源: LINQ的可数方法是否维持元素的相对顺序?

相关文章
相关标签/搜索