2016-08-18 58 views
-5

我在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

我怎樣才能做到這一點?

+0

你的軍銜是什麼意思?問題是不清楚的,並顯示沒有以前的嘗試... – MichaelThePotato

+0

我猜數字越低,排名越低? –

+0

@Matias西塞羅:*最大的*號碼排名* 1 *第二大的排名2等最低的項目排名= n –

回答

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

小提琴 - https://dotnetfiddle.net/7C5o52

+0

我用你的想法與以下列表。但是,這是不工作,因爲'21'重複'列表 arr =新列表 {5,10,7,15,9,21,21,1};' – Sawa

+0

@ Sawa-嘗試使用不同之前添加到字典。 – Developer

1

如果所有在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); 
+0

我創建了循環,但我得到了錯誤。什麼是解決方案 'for(int i = 0; i Sawa

+0

@Sawa:不是'等級[i]',而是'等級[arr [i]]';看到我的編輯 –

+0

我對FCTH方法使用了這個想法,但我得到了以下錯誤 '具有相同密鑰的項目已被添加' 什麼是此錯誤的解決方案? – Sawa

1

可能的最短途徑將使用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 

或者只是打與OrderBySelect

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 
+0

看起來像這樣一個矯枉過正的XD – Neil

+0

@尼爾 - 第二個?雅肯定哈哈,只是玩:) –

+0

雖然我喜歡第一個。很好的答案 – Neil

相關問題