我在有序數組上使用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的可數方法是否維持元素的相對順序?