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中文網其他相關文章!