将IEnumerable的十进制字段与另一个更好的&快捷的方式

时间:2012-12-31 18:13:19

标签: c# linq

在这里遇到了一个情况,虽然我有几种方法可以解决这个问题,但我非常感觉这不是最好的解决方法,因为我现在正在这样做。让我先试着解释一下我的问题。从数据库我得到一个IEnumerable的NavReturnModelSP,其中NavReturnModelSP是一个简单的模型类,如

public class NavReturnModelSP
{
    public string Scheme_Name { get; set; }
    public DateTime Date { get; set; }
    public double ReInvest_Nav { get; set; }
}

现在我需要先按Scheme_Name&日期&然后需要重新定义每个Scheme&日期对值为100的基数,以便从最初的日期开始对方案进行适当的比较。 我无法更改数据库输出。下面是你的参考图片,希望它能更好地解释你的问题。

The problem

我现在只是通过循环来解决它.... 其中'data'是NavReturnModelSP的IEnumerable

var preModel = data.OrderBy(x => x.Scheme_Name).ThenBy(x => x.Date).ToList();
var preScheme = "";
var firstNav = 0d;
for (int i = 0; i < preModel.Count(); i++)
{
    if (preModel[i].Scheme_Name != preScheme)
    {
        firstNav = preModel[i].ReInvest_Nav;
        preModel[i].ReInvest_Nav = 100;
    }
    else
    {
         if (preModel[i - 1].ReInvest_Nav != 0) // Just a check, nothing special.
             preModel[i].ReInvest_Nav = 100 * preModel[i].ReInvest_Nav / firstNav;
    }
    preScheme = preModel[i].Scheme_Name;
}

现在我在ReInvest_Nav列中有'preModel'和rebased数据。但我觉得我没有使用适当的CPU和电源。我可以使用Parallal编程/ PLINQ来最小化时间范围,因为循环的100000行将非常慢。有人可以指导我。

谢谢&amp;新年快乐 :) 桑杰

1 个答案:

答案 0 :(得分:2)

试试这个:

var preModel = data.GroupBy(x => x.Scheme_Name)
                   .Select(x => new {
                                      Scheme_Name = x.Key, 
                                      Max = x.Max(m => m.ReInvest_Nav), 
                                      Data = x
                                    })
                   .SelectMany(x => x.Data.Select(y => new {
                                       y.Scheme_Name, 
                                       y.Date, 
                                       y.ReInvest_Nav, 
                                       Rebased = y.ReInvest_Nav / x.Max * 100
                                     }))
                   .OrderBy(x => x.Scheme_Name)
                   .ThenBy(x => x.Date)
                   .ToList();

我不能保证这会更快,但它避免了显式循环。