2012-09-13 14 views
13

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

最初、私は私の配列のコピーを作成します:

int[] copyArray = myArray.ToArray(); 

それから私はこのように昇順にそれをソートしたいと思います:

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

しかし、私はエラーを取得し、「選択」を取得します" "は暗黙のうちに 'system.linq.iorderedenumerable'を 'int []'に暗黙的に変換できません "

+0

sortedCopyで次に何をしていますか?配列を必要としないかもしれません。 – weston

答えて

32

最後にToArray()に電話する必要があります順序付けられた配列を実際に配列に変換する。 LINQは遅延評価を使用します。つまり、ToArray()ToList()または他の同様の方法を呼び出すまで、中間処理(この場合はソート)は実行されません。

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

例:

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

おそらく表現の構文でこれを書くことが好ましいであろう:

int[] sortedCopy = myArray.OrderBy(i => i).ToArray(); 
+1

ジョンさんありがとうございました! :) 「(i => i)」とはどういう意味ですか? – user1635406

+9

@ user1635406: 'i => i'は*ラムダ関数*です;配列をソートする方法について説明しています。最初の 'i'は' i'という1つの引数を取ることを意味します(正式な名前を指定できます)。この引数は配列に含まれるため、この引数は 'int'です。 2番目の部分は、並べ替える量です。この場合、各番号を「それ自身」としてソートしたいので、 'i => i'です。マークの答えにおける 'x => x.Name'は、' 'x.Name'でソートされた各要素' x'を与えられたことを意味します。 – Jon

+0

最初に配列して注文すると処理が速くなりませんか? –

1

私たちは、あなたが次何をしているか知らないが、多分あなたは必要ありません。配列。それが別のlinqステートメント、つまりforeachに入っている場合は、それをそのままそのまま、最も簡単にはvarを使用してください。

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

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

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

14

注:あなたがコピーを必要としない場合(すなわち、myArrayを変更することが可能です)、その後、はるかに簡単かつ効率的なアプローチだけである:

Array.Sort(myArray); 

これはのインプレースの並べ替えを行います可能な限り効率的な配列であるという事実を利用して、配列を作成します。

var sortedCopy = entityArray.OrderBy(x => x.Name).ToArray(); 
:これはの道徳的等価である

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

:より複雑なシナリオについては

(例えば、オブジェクトの配列のメンバーごとのソート)は、次のようなものを行うことができます

しかし、もう一度、並べ替えをインプレイスで実行します。

+0

ありがとうございます、しかし今回私はコピーが必要でした。 Intresting読書。 :) – user1635406