LINQ で順序を維持する 質問する

LINQ で順序を維持する 質問する

順序付けられた配列に対して LINQ to Objects 命令を使用します。配列の順序が変更されないようにするために、実行すべきでない操作は何ですか?

ベストアンサー1

私は、System.Linq.列挙可能IEnumerable 以外の結果を返すものはすべて破棄しました。それぞれのコメントをチェックして、結果の順序がソースの順序とどのように異なるかを判断しました。

順序は完全に保持されます。インデックスによってソース要素を結果要素にマップできます。

  • 列挙可能
  • キャスト
  • 連結
  • 選択する
  • 配列へ
  • リストへ

順序を保持します。要素はフィルタリングまたは追加されますが、順序は変更されません。

  • 明確な
  • を除外する
  • 交差する
  • タイプ
  • 先頭に追加 (.net 4.7.1 の新機能)
  • スキップ
  • スキップ中
  • 取る
  • テイクウィイル
  • どこ
  • Zip (.net 4 の新機能)

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

  • 辞書へ
  • 見上げる

順序を明示的に再定義 - 結果の順序を変更するために使用します

  • 並び替え
  • 降順で並べ替え
  • 逆行する
  • その後
  • 降順

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

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

編集: これに基づいて、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;
    }

おすすめ記事