如何使用函数c#进行排名

时间:2016-06-24 04:38:00

标签: c# rank

我有这段代码:

private int[] rank(decimal[] NetFlow)
{
    int[] result = new int[NetFlow.Length];
    int temp;
    int[] result2 = new int[NetFlow.Length];
    for (int x = 0; x < NetFlow.Length; x++)
    {
        result[x] = x;
    }

    for (int i = 0; i < NetFlow.Length - 1; i++)
    {
        for (int j = i; j < NetFlow.Length; j++)
        {
            if (NetFlow[result[i]] < NetFlow[result[j]])
            {
                temp = result[i];
                result[i] = result[j];
                result[j] = temp;
            }
        }
    }

    for (int y = 0; y < NetFlow.Length; y++)
    {
        result2[result[y]] = y + 1;
    }
    return result2;
}

以下代码会将排名结果保存到数据库中:

int[] rankResult = rank(NetFlow);
string show = "";

string period = cmbperiodAwal.Text;
string year = numericYear.Value.ToString();
for (int ii = 0; ii < rankResult.Length; ii++)
{

    string Numb = dataGridView1[dataGridView1.Columns["Numb"].Index, ii].Value.ToString();
    RC.rankUpdate(rankResult[ii], Numb, period, year);
    show = show + "\n" + rankResult[ii].ToString() + "  " + Numb + " " + period + " " + year;
}

问题是,当两个数字相等时,我希望等级相等。这是我从NetFlow输入的数据:

  

4.1

     

3.3

     

5.5

     

3.3

     

7.4

我想得到这样的输出:

  

3

     

4

     

2

     

4

     

1

之后我想将值更新到数据库,因此排名有一列。

2 个答案:

答案 0 :(得分:1)

如果我理解正确,您可以使用简单的Linq查询来执行此操作:

var ranks = NetFlow.OrderByDescending(x => x)
    .GroupBy(x => x)
    .Select((x, i) => new { Numbers = x.ToList(), Rank = i + 1});

这将首先将您的输入从最大到最低排序,然后将其分组以处理重复项。最后,您可以在组列表中选择所有数字及其索引。

这将为您提供一个组列表,其中evry组包含(相等)数字作为列表和排名。

答案 1 :(得分:1)

可能不是最有效的方式,但很快就出了我的想法:

var groups = netflow.OrderByDescending(x => x).GroupBy(x => x).Select(x => x.Key).ToArray();
var rank = netflow.Select(x => Array.IndexOf(groups, x)+1);

Check it out here

结果是:

  

3 4 2 4 1