順序付けられた配列でLINQ to Objects命令を使用しています。配列の順序が変更されないようにするために、どの操作を行うべきではありませんか?
順序付けられた配列でLINQ to Objects命令を使用しています。配列の順序が変更されないようにするために、どの操作を行うべきではありませんか?
回答:
System.Linq.Enumerableのメソッドを調べ、IEnumerable以外の結果を返したものはすべて破棄しました。それぞれの発言をチェックして、結果の順序がソースの順序とどのように異なるかを判断しました。
順序を完全に保持します。インデックスによってソース要素を結果要素にマッピングできます
順序を保持します。要素はフィルタリングまたは追加されますが、並べ替えはされません。
Destroys Order-結果を期待する順序がわかりません。
順序を明示的に再定義-これらを使用して結果の順序を変更します
いくつかのルールに従って順序を再定義します。
編集:この実装に基づいて、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;
}
Distinct
メソッドの)ドキュメンテーションは、「予測できない順序」ではなく、単に「ソートされていない」と言うことを意図したものです。のDistinct
ように、上記のフィルタリングカテゴリに属していると思いますWhere
。
SQLについて話しているのですか、それとも配列についてですか?言い換えると、LINQ to SQLまたはLINQ to Objectsを使用していますか?
LINQ to Objectsオペレーターは、実際には元のデータソースを変更しません-データソースによって効果的にサポートされるシーケンスを構築します。順序を変更する唯一の操作は、OrderBy / OrderByDescending / ThenBy / ThenByDescendingです。それでも、これらは同じ順序の要素に対して安定しています。もちろん、多くの操作では一部の要素が除外されますが、返される要素は同じ順序になります。
ToLookupやToDictionaryなどを使用して別のデータ構造に変換する場合、その時点で順序が保持されているとは思いませんが、それでも多少異なります。(ただし、同じキーにマッピングされる値の順序は、ルックアップでも保持されると思います。)
GroupBy
続くSelectMany
と、キーでグループ化された結果が得られますが、キーの昇順ではありません...キーが最初に発生した順序で結果が得られます。
list<x> {a b c d e f g}
、c、d、eのすべてが同じキーを持っている場合、結果のシーケンスにはc、d、eが互いに隣り合って含まれ、c、d、eの順序になります。カテゴリベースのMSベースの回答が見つからないようです。
配列で作業している場合、SQLではなくLINQ-to-Objectsを使用しているように見えます。確認できますか?ほとんどのLINQ操作は何も並べ替えません(出力は入力と同じ順序になります)。そのため、別の並べ替え(OrderBy [Descending] / ThenBy [Descending])を適用しないでください。
[編集:ジョンがより明確に述べたように; LINQは通常、新しいシーケンスを作成し、元のデータはそのままにします]
Dictionary<,>
(ToDictionary)にデータをプッシュすると、辞書は特定の並べ替え順序を考慮しないため、データがスクランブルされることに注意してください。
しかし、最も一般的なもの(選択、場所、スキップ、取得)は問題ありません。
ToDictionary()
何も約束しないだけですが、実際には(入力から何かを削除するまで)入力順序を維持します。これに頼るつもりはありませんが、「スクランブル」は不正確なようです。
私は公式文書を参照する同様の質問で素晴らしい答えを見つけました。それを引用するには:
以下のためEnumerable
のメソッド(に適用されたオブジェクトへのLINQ、 List<T>
)、あなたは、によって返される要素の順序に依存することができSelect
、Where
またはGroupBy
。これは、ToDictionary
やのように本質的に順序付けされていないものには当てはまりませんDistinct
。
Enumerable.GroupByのドキュメントから:
IGrouping<TKey, TElement>
オブジェクトは、それぞれの第一の鍵を生成した元の要素の順序に基づく順序で得られたれますIGrouping<TKey, TElement>
。グループ化の要素は、に表示される順序で生成されsource
ます。
これは、IQueryable
拡張メソッド(他のLINQプロバイダー)には必ずしも当てはまりません。