C# 等效排名
本文关键字: | 更新日期: 2023-09-27 18:36:53
我正在将旧的Excel系统转换为C#,并且Rank.eq函数出现问题。我做的是 3 个列表:包含原始数据的列表、包含排序的第一个列表数据的列表和包含有序列表的反向索引的列表;然后它比较 list1 值是否等于列表 2 val,它在同一位置获取第 3 个列表的索引,如果不是,则跳到第 2 个值进行比较,依此类推。
我的意思是,如果我有:
1
3
3
5
3
7
9
排名显示如下:
No. Rank
1 5
3 4
3 4
5 3
3 4
7 2
9 1
但我需要的是这样的东西:
No. Rank
1 7
3 4
3 4
5 3
3 4
7 2
9 1
如果有重复的值,它应该跳过一些数字。我该如何做第二个示例?谢谢。
这是我的脚本,以防需要:
int l = 0;
for (int i = 0; i < dataGridView1.RowCount - 1; )
{
if (listBox1.Items[i].ToString() == listBox2.Items[l].ToString())
{
dataGridView1.Rows[i].Cells[4].Value = listBox3.Items[l];
i++;
l = 0;
}
else
{
l++;
}
}
下面是对对象集合进行排名的方法的实现。 通过对项目进行分组,然后对组进行排序,可以简单地枚举结果,跟踪到那时为止产生的项目数。
public static IEnumerable<Tuple<T, int>> Rank<T>(this IEnumerable<T> source)
{
var query = source.GroupBy(x => x)
.OrderByDescending(x => x.Key);
var rank = 1;
foreach (var group in query)
{
var groupRank = rank;
foreach (var item in group)
{
yield return Tuple.Create(item, groupRank);
rank++;
}
}
}
我对类似问题的回答:C# 中的 VBA/Excel RANK
public static int Rank<T>(T value, IEnumerable<T> data)
{
return data.OrderByDescending(x => x).ToList().IndexOf(value) + 1;
}