2014-01-24 192 views
1

我正在從電子表格創建計算到C#中,我想知道C#是否有類似Excel的排名方法?C#中的VBA/Excel排名#

排名在Excel

返回號碼列表中的號碼軍銜。 號碼的排名是其相對於列表中其他值的大小。 (如果你要 列表排序,數量的排名將是它的位置。)

語法

RANK(數量,REF順序)

是多少你想要找到你的等級。

參考號是數組列表或數字列表的引用。 忽略ref中的非數值。

訂購是一個數字,指定如何排名數字。

如果訂單爲0(零)或省略,Microsoft Excel會將編號排序,就好像 ref是按降序排列的列表。如果訂單的值爲非零值 ,則Microsoft Excel將按照 的升序順序排列號碼,就像ref是一個列表。

同樣可以通過代碼來實現,但我只是想檢查是否有什麼我首先失蹤。

回答

3

你可以,有點。

 SortedList<int, object> list = new SortedList<int, object>(); 
     // fill with unique ints, and then look for one 
     int rank = list.Keys.IndexOf(i); 

排名將是遞增的,從零開始的位置。

你可以漂亮起來寫一個擴展方法:

public static class Extensions 
{ 
    public static int Rank(this int[] array, int find) 
    { 
     SortedList<int, object> list = new SortedList<int, object>(); 
     for (int i = 0; i < array.Length; i++) 
     { 
      list.Add(array[i], null); 
     } 
     if (list.ContainsKey(find)) 
     { 
      return list.Keys.IndexOf(find); 
     } 
     else 
     { 
      return -1; 
     } 
    } 
} 

而且使用它像:

int[] ints = new int[] { 2, 7, 6, 3, 9, 12 }; 
    int rank = ints.Rank(2); 

...但我不認爲它是最明智的做法。

+0

感謝您的建議。我最終做了與此類似的事情,我很快就會發布我的版本。 – christiandev

1

要獲得RANK相當於你需要得到每個項目的最低指標,當你組:

var ranks = list.OrderBy(x => x) 
       .Select((x, i) => new {x, i = i+1}) // get 1-based index of each item 
       .GroupBy(xi => xi.x)  // group by the item 
       .Select(g => new {rank = g.Min(xi => xi.i), items = g}) // rank = min index of group 
       .SelectMany(g => g.items, (g, gg) => new {g.rank, gg.i}) ; // select rank and item 

,或者如果you'rs一類的屬性分組:

var ranks = list.OrderBy(x => x.{some property}) 
       .Select((x, i) => new {x, i = i+1}) // get 1-based index of each item 
       .GroupBy(xi => xi.x.{some property})  // group by the item's property 
       .Select(g => new {rank = g.Min(xi => xi.i), items = g}) // rank = min index of group 
       .SelectMany(g => g.items, (g, gg) => new {g.rank, gg.i}) ; // select rank and item 
+0

我使用類似於@Simon的解決方案來滿足我的測試,我也會看看這個解決方案,並更新一次測試。謝謝。 – christiandev

0

這個工作對我來說,到目前爲止(和更簡單)

public static int Rank<T>(T value, IEnumerable<T> data) 
{ 
    return data.OrderByDescending(x => x).ToList().IndexOf(value) + 1; 
} 

我用T因此它可以採取所有數字類型(int/double/decimal)。

用法相似到Excel

int[] data = new[] { 3, 2, 2, 3, 4 }; 
int rank = Rank(3, data); // returns 2 

我希望我沒有錯過任何東西