2011-09-12 5 views
4

私はスコアxのパーセンタイルをリスト(リスト結果)から取得したいプログラムを作成しています。私は、式が[(A +(0.5)B)/ n] * 100であることを知っています。ここで、 'A' =スコアxより低いスコアの 'B' =スコアxのスコアの数と 'n' =合計スコアの数。CSharpのリストからパーセンタイルを取得するにはどうすればよいですか?

私の問題は、リスト全体を最高から最低まで並べ替えることができず、xに等しいスコアの数を見つけることができないということです。

+2

この宿題はありますか? – dtb

+0

申し訳ありませんあなたの質問は間違っているので、投稿を削除します – icaptan

+0

いいえ、それは宿題ではありません...私はパーセンタイルを含むように修正できるかどうかを確認するために私の以前のプログラム(グレーディングシステム) – Chielle

答えて

8

それはあなたに有用であろうLINQのように聞こえる:

int equal = tests.Count(tests => test.Score == x); 
int less = tests.Count(tests => test.Score < x); 

int percentile = (200 * less + 100 * equal)/(tests.Count * 2); 

(私は整数の除算の影響を低減するために、2つの除算と乗算し、スケーリングし、すべての順序を変更しました。)

+0

'less.Count()'、 'equal.Count()'? – Dyppl

+0

@Dyppl:いいえ、それらは整数です - 私は 'Where'呼び出しを' Count'呼び出しに変更しました。これは私が以前に意図したものです:) –

+0

@CodeInChaos:私はそうは思わない...少なくともOPの公式に –

3

LINQは優れていますが、パフォーマンスが必要な場合(データセットが大きい場合や、何度もやりたい場合)、または実際に課題が割り当てられている場合は、簡単に実装できます。

int less = 0; 
int equal = 0; 
foreach (int item in list) { 
    if (item < x) 
     less++; 
    else if (item == x) 
     equal++;  
} 
var result = (200 * less + 100 * equal)/(list.Count * 2); 
+0

これは私を助けました..。 – McDee

関連する問題