LINQ 中保持元素顺序
在编程中,处理有序数据是一种常见场景。当使用 LINQ to Objects 操作数组时,了解哪些操作会保留元素的顺序非常重要,以避免意外修改。
保持顺序的操作
以下 LINQ 操作会维护数组元素的原始顺序:
-
AsEnumerable: 将 IEnumerable 转换为非泛型 IEnumerable。
-
Cast: 将元素转换为不同的类型,而不修改顺序。
-
Concat: 组合两个或多个序列,保留每个序列的顺序。
-
Select: 将每个元素投影到一个新值,但保持顺序不变。
-
ToArray: 将 IEnumerable 物化到一个数组中,保留顺序。
-
ToList: 将 IEnumerable 物化到一个 List 中,保持原始顺序。
部分保持顺序的操作
一些 LINQ 操作会过滤或添加元素,而不会重新排序剩余的元素:
-
Distinct: 删除重复元素(基于相等比较器)。(见下文说明)
-
Except: 返回在指定序列中找不到的元素,保留原始序列的顺序。
-
Intersect: 返回在两个序列中都找到的元素,保留第一个序列的顺序。
-
OfType: 过滤特定类型的元素,保留顺序。
-
Prepend(.NET 4.7.1 新增): 在序列的开头添加一个元素。
-
Skip: 跳过序列开头指定的数量的元素,保留剩余元素的顺序。
-
SkipWhile: 跳过元素,直到谓词变为 false,保留剩余元素的顺序。
-
Take: 返回序列开头指定的数量的元素,保留顺序。
-
TakeWhile: 返回元素,直到谓词变为 false,保留顺序。
-
Where: 基于谓词过滤元素,保留匹配元素的顺序。
-
Zip(.NET 4 新增): 将两个序列中的元素配对,保留每个序列的顺序。
破坏顺序的操作
以下 LINQ 操作不会保留元素的原始顺序:
-
ToDictionary: 将序列转换为字典,字典不维护顺序。
-
ToLookup: 与 ToDictionary 类似,不保留顺序。
重新定义顺序的操作
这些 LINQ 操作显式地更改结果的顺序:
-
OrderBy: 根据键选择器按升序排序元素。
-
OrderByDescending: 根据键选择器按降序排序元素。
-
Reverse: 反转元素的顺序。
-
ThenBy: 与 OrderBy 或 OrderByDescending 结合使用,按第二个键排序。
-
ThenByDescending: 与 OrderBy 或 OrderByDescending 结合使用,按第二个键降序排序。
特殊情况
-
GroupBy: 分组对象的顺序基于每个组的第一个元素的顺序。组内的元素按其在源序列中出现的顺序返回。
-
GroupJoin: 保留外部序列中元素的顺序以及每个外部元素的内部序列中匹配元素的顺序。
-
Join: 与 GroupJoin 类似,保留外部序列和匹配内部序列中元素的顺序。
-
SelectMany: 顺序由源元素的顺序和选择器函数返回的序列决定。
-
Union: 来自两个序列的元素按其原始顺序产生,不重复。
说明:
根据 .NET 中的实现,Distinct 已被移至“保持顺序”类别,只要不提供自定义相等比较器,它就会保留元素的顺序。
以上是哪个LINQ操作将序列保留元素的顺序?的详细内容。更多信息请关注PHP中文网其他相关文章!