Как получить процентиль из списка в CSharp? - PullRequest
4 голосов
/ 12 сентября 2011

Я создаю программу, в которой я хотел бы получить процентиль балла x из списка (результаты списка).Я знаю, что формула имеет вид [(A + (0,5) B) / n] * 100, где «A» = количество баллов ниже, чем балл x, «B» = количество баллов, равное баллу x, а «n» = общее количествоколичество баллов.

Моя проблема в том, что мне не удается отсортировать весь список по возрастанию и убыванию, и мне не удается найти количество баллов, равное x.

Ответы [ 2 ]

8 голосов
/ 12 сентября 2011

Звучит так, будто 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);

(Я изменил порядок деления и умножения и масштабировал все на два, чтобы уменьшить влияние целочисленного деления.)

3 голосов
/ 12 сентября 2011

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);
...