使用LINQ保留訂單

我在有序數組上使用LINQ to Objects指令。 我不該該執行哪些操做來確保數組的順序不變? 數組


#1樓

您其實是在談論SQL仍是數組? 換句話說,您是使用LINQ to SQL仍是LINQ to Objects? 數據結構

LINQ to Objects運算符實際上並無更改其原始數據源,而是創建了由數據源有效支持的序列。 惟一會更改順序的操做是OrderBy / OrderByDescending / ThenBy / ThenByDescending-即使如此,那些操做對於相等順序的元素也是穩定的。 固然,許多操做會過濾掉某些元素,可是返回的元素將以相同的順序排列。 加密

若是您轉換爲其餘數據結構(例如,使用ToLookup或ToDictionary),那麼我不認爲此時會保留順序-但這仍是有些不一樣。 (我相信,映射到相同鍵的值的順序會保留用於查找。) spa


#2樓

若是您正在處理數組,則聽起來好像您正在使用LINQ-to-Objects,而不是SQL。 你肯定嗎? 大多數LINQ操做都不會從新排序任何東西(輸出將與輸入順序相同)-所以,請勿應用其餘排序方式(OrderBy [Descending] / ThenBy [Descending])。 .net

[編輯:正如喬恩所說的那樣; LINQ一般會建立一個序列,而將原始數據保留下來] code

請注意,將數據壓入Dictionary<,> (ToDictionary)將對數據進行加密,由於Dictionary不遵照任何特定的排序順序。 對象

可是最多見的事情(選擇,哪裏,跳過,取走)應該沒問題。 排序


#3樓

任何「分組依據」或「排序依據」均可能會更改順序。 索引


#4樓

我檢查了System.Linq.Enumerable的方法,丟棄了全部返回非IEnumerable結果的方法。 我檢查了每一個註釋,以肯定結果的順序與源順序之間的差別。 element

絕對保留訂單。 您能夠按索引將源元素映射到結果元素

  • 無數
  • 康卡特
  • 選擇
  • 數組
  • 到清單

保留訂單。 元素被過濾或添加,但不從新排序。

  • 不一樣
  • 除了
  • 相交
  • 類型
  • 前置(.net 4.7.1中的新功能)
  • 跳躍
  • 跳過而
  • 採起
  • 哪裏
  • 郵編(.net 4中的新功能)

銷燬訂單-咱們不知道指望的訂單順序。

  • 到字典
  • 去查查看

明確地從新定義訂單-使用這些來更改結果的順序

  • 按訂單
  • OrderByDescending
  • 相反
  • 而後
  • 而後降序

根據一些規則從新定義訂單。

  • GroupBy-根據產生每一個IGrouping第一個鍵的源中元素的順序,按順序產生IGrouping對象。 分組中的元素按它們在源中出現的順序產生。
  • GroupJoin-GroupJoin保留外部元素的順序,對於外部元素,從內部匹配元素的順序。
  • 鏈接-保留外部元素的順序,對於每一個元素,保留內部匹配元素的順序。
  • SelectMany-對於源的每一個元素,都會調用選擇器,並返回一個值序列。
  • 聯合-枚舉此方法返回的對象時,聯合按該順序枚舉第一個和第二個,併產生還沒有產生的每一個元素。

編輯:基於此實現,我已將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;
    }

#5樓

我在引用官方文檔的相似問題中找到了一個很好的答案。 引用一下:

對於Enumerable方法(適用於List<T> LINQ to Objects),能夠依靠SelectWhereGroupBy返回的元素順序。 對於本質上無序的事物(例如ToDictionaryDistinct ,狀況並不是如此。

Enumerable.GroupBy文檔中:

所述IGrouping<TKey, TElement>對象的順序,獲得基於所產生的每個第一密鑰在源中的元素的順序上IGrouping<TKey, TElement> 分組中的元素按它們在source出現的順序產生。

對於IQueryable擴展方法(其餘LINQ提供程序),不必定是正確的。

資料來源: LINQ的可數方法是否維持元素的相對順序?

相關文章
相關標籤/搜索