394

順序付き配列で LINQ to Objects 命令を使用します。配列の順序が変更されていないことを確認するために、どの操作を行うべきではありませんか?

4

6 に答える 6

710

System.Linq.Enumerableのメソッドを調べ、IEnumerable 以外の結果を返したメソッドを破棄しました。それぞれの発言をチェックして、結果の順序がソースの順序とどのように異なるかを判断しました。

順序を絶対に保持します。インデックスによってソース要素を結果要素にマップできます

  • AsEnumerable
  • キャスト
  • 連結
  • 選択する
  • 配列へ
  • リストへ

秩序を保ちます。要素はフィルタリングまたは追加されますが、並べ替えはされません。

  • 明確
  • を除外する
  • 交わる
  • タイプの
  • プリペンド (.net 4.7.1 の新機能)
  • スキップ
  • SkipWhile
  • 取った
  • テイクホワイル
  • どこ
  • Zip (.net 4 の新機能)

秩序を破壊する - 結果がどのような順序になるかはわかりません。

  • 辞書へ
  • 見上げる

順序を明示的に再定義 - これらを使用して結果の順序を変更します

  • オーダーバイ
  • 降順で並べる
  • 逆行する
  • ThenBy
  • ThenByDescending

いくつかの規則に従って順序を再定義します。

  • GroupBy - IGrouping オブジェクトは、各 IGrouping の最初のキーを生成した source 内の要素の順序に基づく順序で生成されます。グループ内の要素は、ソースに表示される順序で生成されます。
  • GroupJoin - GroupJoin は、outer の要素の順序を保持し、outer の各要素について、inner から一致する要素の順序を保持します。
  • 結合 - 外側の要素の順序を保持し、これらの各要素について、内側の一致する要素の順序を保持します。
  • SelectMany - source の各要素に対して、selector が呼び出され、一連の値が返されます。
  • Union - このメソッドによって返されたオブジェクトが列挙されると、Union は最初と 2 番目をその順序で列挙し、まだ生成されていない各要素を生成します。

編集: Distinct を Preserving order based on this implementationに移動しました。

    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;
    }
于 2008-10-15T13:51:27.133 に答える
38

あなたは実際にSQLについて話しているのですか、それとも配列について話しているのですか? 別の言い方をすれば、LINQ to SQL または LINQ to Objects を使用していますか?

LINQ to Objects 演算子は、実際には元のデータ ソースを変更しません。データ ソースによって効果的にサポートされるシーケンスを構築します。順序を変更する唯一の操作は、OrderBy/OrderByDescending/ThenBy/ThenByDescending です。それでも、それらは均等に順序付けられた要素に対して安定しています。もちろん、多くの操作では一部の要素が除外されますが、返される要素は同じ順序になります。

たとえば、ToLookup や ToDictionary を使用して別のデータ構造に変換した場合、その時点で順序が保持されているとは思えませんが、とにかく多少異なります。(ただし、同じキーにマッピングされる値の順序はルックアップのために保持されていると思います。)

于 2008-10-15T12:24:00.523 に答える
8

配列で作業している場合、SQL ではなく LINQ-to-Objects を使用しているように聞こえます。確認できますか?ほとんどの LINQ 操作は何も並べ替えません (出力は入力と同じ順序になります)。そのため、別の並べ替え (OrderBy[降順]/ThenBy[降順]) を適用しないでください。

[編集: ジョンがより明確に述べたように; 通常、LINQ は新しいシーケンスを作成し、元のデータはそのままにします]

(ToDictionary)にデータをプッシュすると、データDictionary<,>がスクランブルされることに注意してください。これは、ディクショナリが特定の並べ替え順序を尊重しないためです。

ただし、最も一般的なもの (Select、Where、Skip、Take) は問題ありません。

于 2008-10-15T12:25:09.333 に答える
5

公式ドキュメントを参照する同様の質問で素晴らしい回答を見つけました。それを引用するには:

Enumerableメソッド ( に適用される LINQ to Objects ) の場合、 、、またはList<T>によって返される要素の順序に依存できます。これは、やのように本質的に順序付けされていないものには当てはまりません。SelectWhereGroupByToDictionaryDistinct

Enumerable.GroupByドキュメントから:

オブジェクトは、IGrouping<TKey, TElement>それぞれの最初のキーを生成した source 内の要素の順序に基づいた順序で生成されますIGrouping<TKey, TElement>。グループ内の要素は、 に表示される順序で生成されsourceます。

IQueryableこれは、拡張メソッド (他の LINQ プロバイダー)には必ずしも当てはまりません。

ソース: LINQ の列挙可能なメソッドは要素の相対的な順序を維持しますか?

于 2014-06-11T21:04:43.257 に答える
2

「group by」または「order by」は、順序を変更する可能性があります。

于 2008-10-15T12:53:11.447 に答える