2011-10-29 7 views
5

こんにちは私は、文字列とintsを格納するルックアップタイプがあります。ルックアップをソートするには?

static Lookup<string, int> lookup; 
lookup = (Lookup<string, int>)list.ToLookup(i => i.IP, i => i.Number); 

これで値(数値)でこの検索をソートし、値の上位10個のキーを取得する必要があります。

これはどのように可能ですか?

+1

私はこれを理解しようとしています。 'i.Number'を' string'にキャストしているのはなぜですか? – James

+0

こんにちはすみませんでした。それを今変えてください。また、私が家に帰って今夜試してみると答えが悪いです。多くの皆さん、ありがとう。 – sprocket12

答えて

2

あなたはLookup<string, int>Lookup<string, string>にキャストされている理由は、私はわからないんだけど、あなたが望む一般的な答えは次のとおりです。

var list = new List<Test> 
    { 
      new Test { IP = "A", Number = 1 }, new Test { IP = "A", Number = 3 }, new Test { IP = "A", Number = 4 }, 
      new Test { IP = "B", Number = 1 }, new Test { IP = "B", Number = 1 }, new Test { IP = "B", Number = 1 }, 
      new Test { IP = "C", Number = 1 }, 
      new Test { IP = "D", Number = 1 }, 
      new Test { IP = "E", Number = 1 }, new Test { IP = "E", Number = 1 }, new Test { IP = "E", Number = 1 } 
    }; 

var values = list.ToLookup(s => s.IP, s => s.Number) 
       .OrderByDescending(s => s.Count()) 
       .Take(10); 
+0

テストリスト作成に余計な努力をしてくれてありがとう。 – sprocket12

0

Take() LINQ関数を見てみると、Take(10)のように10個の結果しか返さないはずです。ソートの仕方として、ラムダ式を受け入れる関数OrderBy()をチェックしてください。両方を組み合わせると、あなたが何をしているのかが分かるはずです。

1

Goは(あなたがhttp://www.itu.dk/research/c5/ 1つを見つけることができます)プライオリティキューを見つけます。ルックアップを繰り返し、ルックアップの各エントリから作成されたIComparable項目を優先順位キューに挿入します。優先度キューから上位10個の項目を選択します。または、カウント値をキーとしてソートするだけです。

var lookup = list.ToLookup(l => l.IP, l => l.Number); 
var topten = lookup.OrderByDescending(l => l.Count()) 
        .Take(10); 

foreach (var item in topten) 
{ 
    Console.WriteLine("{0}: {1}", item.Key, item.Count()); 
} 

ソートには最高でO(nlogn)のパフォーマンスがあり、ヒープベースの優先度の高いキューにはO(ログ)のパフォーマンスがあることに注意してください。コレクションが大規模でない場合、ソートは組み込みのサポートと、優先クラスの実装をサポートするために中間クラスを必要としないため、より簡単です。

+0

こんにちは、あなたの答えは正しいですが、私は2つの答えを正しいとマークできませんでした。ご協力いただき誠にありがとうございます。 – sprocket12

2

残念ながら、ルックアップ内の要素は並べ替えられません。

しかし、ToLookup()メソッドは、すべてのグループの要素が元のシーケンスの要素と同じ順序を持つという素敵なプロパティを持っています。

これは、いくつかのLINQの体操で、あなたはGROUPBYを使って、あなたが望むものを達成できることを意味します

var l = (from l in list 
     // group elements by key 
     group l by l.IP into g 
     // for each group order the elements and take top 10 
     select new { g.Key, Items = g.OrderBy(g1 => g1.Number).Take(10)} into g2 
     // flaten group into an enumerable using select many 
     from g in g2.Items 
     select g) 
     // get the desired lookup containing the top 10 ordered elements for each key 
     .ToLookup(g => g.IP, g => g.Number); 
+0

オハイオ州、彼はトップテンキーを望んでいて、トップ10をカウントしたくないのですか?私はそれを完全に逃した。 –

+0

"すべてのグループの要素は、元のシーケンスの要素と同じ順序になっています。" - 知っておきたいことです。 – Homer

関連する問題