我有以下数字:
Dim lst() As Integer = {4, 3, 200, 250, 670, 1, 450, 3, 10, 15, 900, 450}
我需要将它们列为一系列具有数字和相应等级的对象,其结果如下:
Number Rank
900 100
670 90
450 80
450 80
250 60
200 50
15 40
10 30
4 20
3 10
3 10
1 0
我很难过 - 我现在得到了这个:
Dim t = From l In lst
Order By l Descending
Select New With {
.Number = l,
.Rank = ((From o In lst Where o > l Select o).Distinct.Count + 1)}
这项技术将用于大约3000多个对象的一系列列表中,我怀疑我的方法的性能将是可怕的,并且当我将其与完整数据集一起使用时可以改进。
我们将非常感谢任何建议......
答案 0 :(得分:1)
修正了......我已经非常接近了:
Dim lst() As Integer = {4, 3, 200, 250, 670, 1, 450, 15, 15, 15, 900, 450}
Dim t = (From l In lst Order By l Descending).Select(
Function(l, Index) New With {
.Number = l,
.Rank = 100 - (((From o In lst Where o > l Select o).Count + 1) - 1) * 100 / lst.Count})
答案 1 :(得分:1)
您的解决方案不是最佳解决方案,因为您在匿名对象中设置Rank属性时枚举每个项目的列表。
更智能的解决方案是利用排序根据最后一项索引找出percentile
。
var sorted = lst.OrderByDescending(n => n).ToList();
var result = sorted.Select((val) => new
{
Number = val,
Rank = (sorted.Count - (sorted.LastIndexOf(val) + 1)) * 100 / sorted.Count
}).ToList();
这比您的3,000件商品的解决方案快<10倍。
您可以轻松地将我的C#代码转换为VB.NET。