Linq to object - 按降序排列100项

时间:2014-06-20 09:31:04

标签: linq

我有以下数字:

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多个对象的一系列列表中,我怀疑我的方法的性能将是可怕的,并且当我将其与完整数据集一起使用时可以改进。

我们将非常感谢任何建议......

2 个答案:

答案 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。