我有这段代码:
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
之后我想将值更新到数据库,因此排名有一列。
答案 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);
结果是:
3 4 2 4 1