我在C#以下列表:如何使用C#獲取列表中多個數字的排名列表?
List<double> arr = new List<double> { 5, 10, 7, 15, 9, 21, 1 };
我想存儲他們的隊伍在另一個列表例如List<double> rank
。最後,我希望得到如下:
6 3 5 2 4 1 7
我怎樣才能做到這一點?
我在C#以下列表:如何使用C#獲取列表中多個數字的排名列表?
List<double> arr = new List<double> { 5, 10, 7, 15, 9, 21, 1 };
我想存儲他們的隊伍在另一個列表例如List<double> rank
。最後,我希望得到如下:
6 3 5 2 4 1 7
我怎樣才能做到這一點?
List<double> arr = new List<double> { 5, 10, 7, 15, 9, 21, 1 };
var rankDict = arr.Distinct().OrderByDescending(num=>num)
.Select((number, index) => new {Number = number, Rank = index})
.ToDictionary(m => m.Number, m => m.Rank);
var rankedArray = new List<double>();
foreach(var num in arr)
{
rankedArray.Add(rankDict[num] + 1);
}
Console.WriteLine(string.Join("-", rankedArray));
如果所有在ARR的項目是不同,您可以創建一個字典:
List<double> arr = new List<double> { 5, 10, 7, 15, 9, 21, 1 };
var ranks = arr
.OrderByDescending(item => item)
.Select((item, index) => new {
item = item,
rank = index + 1,
})
.ToDictionary(x => x.item, x => x.rank);
然後用ranks
找出賦予其相應級別的項目:
int rankOf5 = ranks[5]; // 6
測試
string test = string.Join(" ", arr.Select(x => ranks[x]));
// 6 3 5 2 4 1 7
Console.Write(test);
編輯:測試與循環:
foreach (var item in arr)
Console.Write(ranks[item]);
或者
for (int i = 0; i < arr.Count; ++i)
Console.Write(ranks[arr[i]]);
編輯2如果arr
可以有重複,例如
// 21 appears 2 times
List<double> arr = new List<double> { 5, 10, 7, 15, 9, 21, 21, 1 };
你可能要計算所謂密集排名
var ranks = arr
.GroupBy(item => item)
.OrderByDescending(chunk => chunk.Key)
.Select((chunk, index) => new {
item = chunk.Key,
rank = index + 1
})
.ToDictionary(x => x.item, x => x.rank);
string test = string.Join(" ", arr.Select(x => ranks[x]));
// 6 3 5 2 4 1 1 7
Console.Write(test);
可能的最短途徑將使用IndexOf
訂貨清單後:
List<double> arr = new List<double> { 5, 10, 7, 15, 9, 21, 1 };
var ranking = arr.OrderByDescending(item => item)
.Select(item => arr.IndexOf(item)+1)
.ToList();
//Output: 6, 2, 5, 2, 4, 1, 7
或者只是打與OrderBy
和Select
:
var ranking = arr.Select((item, index) => new { Item = item, Index = index })
.OrderByDescending(item => item.Item)
.Select((item, index) => new { Item = item.Item, OriginalIndex = item.Index, Rank = ++index })
.OrderBy(item => item.OriginalIndex)
.Select(item => item.Rank)
.ToList();
//Output: 6, 2, 5, 2, 4, 1, 7
你的軍銜是什麼意思?問題是不清楚的,並顯示沒有以前的嘗試... – MichaelThePotato
我猜數字越低,排名越低? –
@Matias西塞羅:*最大的*號碼排名* 1 *第二大的排名2等最低的項目排名= n –