0

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

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

现在我需要先按 Scheme_Name 和 Date 对集合进行排序,然后需要将每个 Scheme 和 Date 对值重新设置为 100 的基数,以便从第一个日期开始在方案之间进行适当的比较。我无法更改数据库输出。下面是一张图片供您参考,希望它能更好地解释您的问题。

问题

我现在只是通过循环来解决它......其中“数据”是 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”。但我觉得我没有使用适当的 CPU 功能,我可以使用并行编程/PLINQ 来最小化时间框架,因为 100000 行循环会很慢。有人可以指导我吗。

谢谢和新年快乐:) 桑杰

4

1 回答 1

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();

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

于 2012-12-31T18:39:19.483 回答