我在有序数组上使用LINQ to Objects指令。 我不该该执行哪些操做来确保数组的顺序不变? 数组
您其实是在谈论SQL仍是数组? 换句话说,您是使用LINQ to SQL仍是LINQ to Objects? 数据结构
LINQ to Objects运算符实际上并无更改其原始数据源,而是创建了由数据源有效支持的序列。 惟一会更改顺序的操做是OrderBy / OrderByDescending / ThenBy / ThenByDescending-即使如此,那些操做对于相等顺序的元素也是稳定的。 固然,许多操做会过滤掉某些元素,可是返回的元素将以相同的顺序排列。 加密
若是您转换为其余数据结构(例如,使用ToLookup或ToDictionary),那么我不认为此时会保留顺序-但这仍是有些不一样。 (我相信,映射到相同键的值的顺序会保留用于查找。) spa
若是您正在处理数组,则听起来好像您正在使用LINQ-to-Objects,而不是SQL。 你肯定吗? 大多数LINQ操做都不会从新排序任何东西(输出将与输入顺序相同)-所以,请勿应用其余排序方式(OrderBy [Descending] / ThenBy [Descending])。 .net
[编辑:正如乔恩所说的那样; LINQ一般会建立一个新序列,而将原始数据保留下来] code
请注意,将数据压入Dictionary<,>
(ToDictionary)将对数据进行加密,由于Dictionary不遵照任何特定的排序顺序。 对象
可是最多见的事情(选择,哪里,跳过,取走)应该没问题。 排序
任何“分组依据”或“排序依据”均可能会更改顺序。 索引
我检查了System.Linq.Enumerable的方法,丢弃了全部返回非IEnumerable结果的方法。 我检查了每一个注释,以肯定结果的顺序与源顺序之间的差别。 element
绝对保留订单。 您能够按索引将源元素映射到结果元素
保留订单。 元素被过滤或添加,但不从新排序。
销毁订单-咱们不知道指望的订单顺序。
明确地从新定义订单-使用这些来更改结果的顺序
根据一些规则从新定义订单。
编辑:基于此实现,我已将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; }
我在引用官方文档的相似问题中找到了一个很好的答案。 引用一下:
对于Enumerable
方法(适用于List<T>
LINQ to Objects),能够依靠Select
, Where
或GroupBy
返回的元素顺序。 对于本质上无序的事物(例如ToDictionary
或Distinct
,状况并不是如此。
从Enumerable.GroupBy文档中:
所述
IGrouping<TKey, TElement>
对象的顺序,获得基于所产生的每个第一密钥在源中的元素的顺序上IGrouping<TKey, TElement>
分组中的元素按它们在source
出现的顺序产生。
对于IQueryable
扩展方法(其余LINQ提供程序),不必定是正确的。
资料来源: LINQ的可数方法是否维持元素的相对顺序?