我有一个包含嵌套并行循环的方法来填充循环的一个属性。
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秒,这并不理想。我不能把它放在缓存中,因为它是相当动态的。任何帮助将不胜感激。