25

int 配列を昇順にソートしたいと思います。

まず、配列のコピーを作成します。

int[] copyArray = myArray.ToArray();

次に、次のように昇順で並べ替えます。

 int[] sortedCopy = from element in copyArray 
                    orderby element ascending select element;

しかし、エラーが発生し、「選択済み」が強調表示され、エラーは次のとおりです。

4

3 に答える 3

55

ToArray()順序付けられたシーケンスを実際に配列に変換するには、最後に呼び出す必要があります。LINQ は遅延評価を使用します。これは、 を呼び出すまでToArray()ToList()または他の同様のメソッドを呼び出すまで、中間処理 (この場合は並べ替え) が実行されないことを意味します。

これを行うと、要素のコピーが既に作成されているため、最初に独自のコピーを実際に作成する必要はありません。

例:

int[] sortedCopy = (from element in myArray orderby element ascending select element)
                   .ToArray();

これを式の構文で記述する方がおそらく望ましいでしょう:

int[] sortedCopy = myArray.OrderBy(i => i).ToArray();
于 2012-09-13T11:00:48.337 に答える
24

注: コピーが必要ない場合 (つまり、変更しても問題ない場合myArray)、より単純で効率的な方法は次のとおりです。

Array.Sort(myArray);

これは配列のインプレースソートを行い、配列であるという事実を可能な限り効率的に活用します。

より複雑なシナリオ (たとえば、オブジェクト配列のメンバーごとの並べ替え) では、次のようなことができます。

Array.Sort(entityArray, (x,y) => string.Compare(x.Name, y.Name));

これは、次の道徳的等価物です。

var sortedCopy = entityArray.OrderBy(x => x.Name).ToArray();

繰り返しますが、並べ替えをその場で行います。

于 2012-09-13T11:10:55.913 に答える
2

次に何をするかはわかりませんが、配列は必要ないかもしれません。別の linq ステートメントまたは foreach に入る場合は、最も単純にvar.

var sortedCopy = myArray.OrderBy(i => i);

foreach(var item in sortedCopy)
{
   //print out for example
}

これにより、linq を可能な限り遅延させることができます。ToArray常にor ToListthenをキャストする場合、その場で評価し、結果にメモリを割り当てる以外に選択肢はありません。

于 2012-09-13T11:10:48.783 に答える