順序付けられた配列に対して 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;
}