增强嵌套并行循环的方法

时间:2016-10-05 12:23:16

标签: c# task-parallel-library

我有一个包含嵌套并行循环的方法来填充循环的一个属性。

public static string CalculateFantasyPointsLeagueSettings(ref List<Projections> projection, League league, Teams teamList)
{
    string PPR = "";
    var stats = (from a in league.Settings.StatCategories.stats
                 join b in league.Settings.StatModifiers.stats on a.StatId equals b.StatId
                 select new Tuple<string, double>(a.Name.Replace(" ", string.Empty), b.Value)).ToList();


    var props = new Projections().GetType().GetProperties();

    double receptionValue = (stats.Where(a => a.Item1 == "Receptions").Select(a => a.Item2).FirstOrDefault());

    if (receptionValue == 1.0)
    {
        PPR = "PPR";
    }
    else if (receptionValue == .5)
    {
        PPR = "Half PPR";
    }
    Parallel.ForEach(projection, proj =>
    {
        double points = 0;
        Parallel.ForEach(props, prop =>
        {

            var stat = (from a in stats
                        where a.Item1 == prop.Name
                        select
                         Convert.ToDouble(prop.GetValue(proj, null)) * a.Item2
                        ).FirstOrDefault();

            points += stat;
        });
        proj.ProjectedPoints = Math.Round(points, 2);
        proj.FantasyTeam = (from a in teamList.TeamList
                            where a.Players.player.Select(b => b.Name.Full).Contains(proj.Name)
                            select a.Name).FirstOrDefault();
    });
    return PPR;
}

这种方法的作用是根据他们的联赛设置(统计对象)和他们的预测统计数据(投影列表)计算梦幻足球运动员的积分。由于统计信息不是静态列表(您可以使用自定义设置),因此我需要能够遍历该列表中的所有项目,并手动计算每个项目。为了做到这一点,我必须在Reflection中获取属性,而不是使用它的值。由于投影有大约35k记录,而统计数据将远远超过30,因此这种方法需要很长时间才能运行,可能是由于反射。我想弄清楚我能做些什么来让它跑得更快。现在大约需要2-3秒,这并不理想。我不能把它放在缓存中,因为它是相当动态的。任何帮助将不胜感激。

0 个答案:

没有答案