2009-07-23 6 views
11

私は整数の次の配列を持っている:LINQを使用してint配列の上位3要素を取得する方法は?

int[] array = new int[7] { 1, 3, 5, 2, 8, 6, 4 }; 

私は、アレイ内の上位3つの要素を取得するには、次のコードを書きました:私はtopThree内だかどうか確認すると

var topThree = (from i in array orderby i descending select i).Take(3); 

を、私が見つけます:

{System.Linq.Enumerable.TakeIterator}
数:0

私は間違っていましたが、どうすれば自分のコードを修正できますか?

+4

topThreeのオブジェクトは* results *ではなく、* query *です。 topThreeは、「配列のアイテムのシーケンスを最高から最低までソートし、最初の3つを取る」という意味のオブジェクトです。それは*すべて*ということです。それは "8、6、5"を意味しません。 *結果*ではなく、*クエリ*を意味します。これを実証するには、クエリを実行し、配列を変更してから再度クエリを実行します。クエリはまったく同じですが、結果は異なります。 –

答えて

23

「topThreeの内側にあるものを確認しましたか?」そうするための最も簡単な方法は、それらをプリントアウトすることです:

using System; 
using System.Linq; 

public class Test 
{ 
    static void Main()   
    { 
     int[] array = new int[7] { 1, 3, 5, 2, 8, 6, 4 }; 
     var topThree = (from i in array 
         orderby i descending 
         select i).Take(3); 

     foreach (var x in topThree) 
     { 
      Console.WriteLine(x); 
     } 
    } 
} 

が私には大丈夫見える...

は、トップN値を見つけるのより効率的な方法は、ソートよりも潜在的にありますが、これは確かに動作します。あなたは多分戻って別の配列に結果を取得したい、

var topThree = array.OrderByDescending(i => i) 
        .Take(3); 
+0

QuickWatchで確認しました。物事をより明確にしてくれてありがとう。 –

+2

QuickWatchはおそらくあなたが本当にそれを要求しない限り、あなたのためのコードを実行しないように、おそらく保守的です。クエリは実際にデータを持っていません - データを取得する方法を知っているだけです。データを取得するのが遅くなるか、副作用が生じる可能性があるため、デフォルトでデバッガにそのデータを表示することは好ましくありません。 –

+0

"並べ替えるよりも上位のN値を見つけるより効率的な方法があります" - より効率的な方法の例を提供できますか? –

11

あなたのコードは、私には罰金だ:あなたは一つだけを行い、クエリのドット表記を使用して検討する必要がありますか?

int[] topThree = array.OrderByDescending(i=> i) 
         .Take(3) 
         .ToArray(); 
3

これは、linqクエリの実行が遅延したためです。

.ToArray()または.ToList()などを追加すると、正しい結果が得られるはずです。

-1
int[] intArray = new int[7] { 1, 3, 5, 2, 8, 6, 4 };    
int ind=0; 
var listTop3 = intArray.OrderByDescending(a=>a).Select(itm => new { 
    count = ++ind, value = itm 
}).Where(itm => itm.count < 4); 
関連する問題