1. ホーム
  2. c#

[解決済み] LINQによる順序の保持

2022-03-23 01:13:35

質問

LINQ to Objectsの命令で、順序付き配列を使っています。 配列の順序が変更されないようにするには、どのような操作を行うべきでしょうか?

どのように解決するのですか?

の方法を検討しました。 システム.Linq.Enumerable IEnumerableでない結果を返したものは破棄しています。 それぞれの備考をチェックして、結果の順序がソースの順序とどのように異なるかを判断しました。

順序を絶対的に保持する。 ソース要素をインデックスで結果要素にマッピングすることができます。

  • AsEnumerable
  • キャスト
  • コンキャット
  • 選択
  • ToArray
  • リスト

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

  • 識別
  • 除く
  • 交差する
  • OfType
  • プリペンド(.net 4.7.1での新機能)
  • スキップ
  • スキップホイール
  • テイク
  • テイクホイール
  • どこ
  • Zip(.net4での新機能)

順序を破壊する - 結果をどのような順序で期待するかはわからない。

  • ToDictionary
  • ToLookup

Order Explicitlyの再定義 - 結果の順序を変更する場合に使用します。

  • 注文方法
  • 降順(OrderByDescending
  • 逆方向
  • センバツ
  • 降順(ThenByDescending

いくつかの規則に従ってOrderを再定義する。

  • GroupBy - IGroupingオブジェクトは、各IGroupingの最初のキーを生成したソース内の要素の順序に基づいて降伏されます。グループ化された要素は、ソースに表示される順序で生成されます。
  • GroupJoin - GroupJoinは、outerの要素の順序を保持し、outerの各要素について、innerの一致する要素の順序を保持します。
  • Join - outerの要素の順序を維持し、これらの要素のそれぞれについて、innerの一致する要素の順序を維持します。
  • SelectMany - sourceの各要素に対して、セレクタが呼び出され、一連の値が返されます。
  • Union - このメソッドが返すオブジェクトが列挙されたとき、Unionは1番目と2番目の順番で列挙し、まだ収得されていない各要素を収得します。

Edit: これに基づき、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;
    }