我在有序数组上使用 LINQ to Objects 指令。
为了确保数组的顺序不改变,我不应该执行哪些操作?
我检查了以下方法System.Linq.Enumerable http://msdn.microsoft.com/en-us/library/system.linq.enumerable_methods.aspx,丢弃任何返回非 IEnumerable 结果的内容。我检查了每个的注释,以确定结果的顺序与源的顺序有何不同。
绝对保留秩序。您可以通过索引将源元素映射到结果元素
- 作为可枚举的
- Cast
- Concat
- Select
- ToArray
- ToList
保留秩序。元素被过滤或添加,但不会重新排序。
- Distinct
- Except
- 相交
- OfType
- 前置(.net 4.7.1 中的新增功能)
- Skip
- 跳过时
- Take
- 稍事休息
- Where
- Zip(.net 4 中的新增功能)
破坏秩序 - 我们不知道预期结果是什么顺序。
显式重新定义顺序 - 使用它们来更改结果的顺序
- OrderBy
- 按降序排列
- Reverse
- ThenBy
- 然后按降序
根据一些规则重新定义Order。
- GroupBy - IGrouping 对象的生成顺序基于源中生成每个 IGrouping 第一个键的元素的顺序。分组中的元素按照它们在源中出现的顺序生成。
- GroupJoin - GroupJoin 保留外部元素的顺序,并且对于外部的每个元素,保留内部匹配元素的顺序。
- Join - 保留外部元素的顺序,并且对于每个元素,保留内部匹配元素的顺序。
- SelectMany - 对于源的每个元素,调用选择器并返回值序列。
- Union - 枚举此方法返回的对象时,Union 按该顺序枚举第一个和第二个,并生成尚未生成的每个元素。
编辑:我已将 Distinct 移至 Preserving order 基于此执行 https://github.com/dotnet/corefx/blob/master/src/System.Linq/src/System/Linq/Enumerable.cs.
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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)