在这里遇到了一个情况,虽然我有几种方法可以解决这个问题,但我非常感觉这不是最好的解决方法,因为我现在正在这样做。让我先试着解释一下我的问题。从数据库我得到一个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的基数,以便从最初的日期开始对方案进行适当的比较。 我无法更改数据库输出。下面是你的参考图片,希望它能更好地解释你的问题。
我现在只是通过循环来解决它.... 其中'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;新年快乐 :) 桑杰
答案 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();
我不能保证这会更快,但它避免了显式循环。