У меня есть требование ранжировать элементы массива, а массив имеет повторяющиеся значения. Я пробовал следовать этому Ранжированию элементов в списке с помощью LINQ, но это не не работает, если в массиве есть повторяющиеся значения. Любой простой способ сделать это на С #?

Например :

input = [650,150,150,200] 
output = [1,3,3,2]

Например :

input = [650,200,200,150] 
output = [1,2,2,3]
-1
Deepak Kothari 24 Фев 2021 в 14:23

2 ответа

Лучший ответ

Вы можете создать массив элементов, отдельных и по порядку, а затем использовать индексы для определения ранга каждого элемента.

var ranks = input.Distinct().OrderByDescending(x => x).ToArray();
var ranked = input.Select(x => Array.IndexOf(ranks, x) + 1);

Рабочий пример

2
Johnathan Barclay 24 Фев 2021 в 11:27

Вы можете создать словарь как источник поиска ранжирования:

int[] array = new[] {650,150,150,200};
Dictionary<int, int> numRanks = array
    .GroupBy(i => i)
    .OrderByDescending(g => g.Key)
    .Select((g, index) => (num:g.Key, rank:index+1))
    .ToDictionary(x => x.num, x => x.rank);
int[] result = array.Select(i => numRanks[i]).ToArray();
3
Tim Schmelter 24 Фев 2021 в 11:32