这个表达式是否需要优化?

时间:2013-06-05 13:36:27

标签: c# .net optimization

我不喜欢这个功能的外观。如果没有“魔法字符串”,有没有办法让它看起来不那么难看。

private static bool Inconsistent(AdStats adStat)   {
  return 
    adStat.Daily.Impressions != adStat.Hourly.Sum(h => h.Value.Impressions) ||
    adStat.Daily.Clicks != adStat.Hourly.Sum(h => h.Value.Clicks) ||
    adStat.Daily.Spent != adStat.Hourly.Sum(h => h.Value.Spent) ||
    adStat.Daily.SocialImpressions != adStat.Hourly.Sum(h => h.Value.SocialImpressions) ||
    adStat.Daily.SocialClicks != adStat.Hourly.Sum(h => h.Value.SocialClicks) ||
    adStat.Daily.SocialSpent != adStat.Hourly.Sum(h => h.Value.SocialSpent) ||
    adStat.Daily.UniqueImpressions != adStat.Hourly.Sum(h => h.Value.UniqueImpressions) ||
    adStat.Daily.UniqueClicks != adStat.Hourly.Sum(h => h.Value.UniqueClicks) ||
    adStat.Daily.SocialUniqueImpressions != adStat.Hourly.Sum(h => h.Value.SocialUniqueImpressions) ||
    adStat.Daily.SocialUniqueClicks != adStat.Hourly.Sum(h => h.Value.SocialUniqueClicks);
}

2 个答案:

答案 0 :(得分:5)

我认为“优化”是指“冗余减少”又名Don't Repeat Yourself

基本上,你有一堆指标。您要检查,对于任何这些指标,每日基础上广告的指标值是否与每小时基础上该指标的总和不同。

一旦你这样想,你可以这样做:

Func<Stat, int>[] metricGetters = 
{
   stat => stat.Impressions,
   stat => stat.Clicks,
   // .. etc. etc.
};

return metricGetters.Any(getter => getter(adStat.Daily) 
                                != adStat.Hourly.Sum(h => getter(h.Value)));

答案 1 :(得分:1)

你可以将adStat.Hourly.Select(h =&gt; h.Value)提取到变量,它会减少代码数量:

 private static bool Inconsistent(AdStats adStat)
    {
        var hourlyValue = adStat.Hourly.Select(x => x.Value);
        return
          adStat.Daily.Impressions != hourlyValue.Sum(h => h.Impressions) ||
          adStat.Daily.Clicks != hourlyValue.Sum(h => h.Clicks) ||
          adStat.Daily.Spent != hourlyValue.Sum(h => h.Spent) ||
          adStat.Daily.SocialImpressions != hourlyValue.Sum(h => h.SocialImpressions) ||
          adStat.Daily.SocialClicks != hourlyValue.Sum(h => h.SocialClicks) ||
          adStat.Daily.SocialSpent != hourlyValue.Sum(h => h.SocialSpent) ||
          adStat.Daily.UniqueImpressions != hourlyValue.Sum(h => h.UniqueImpressions) ||
          adStat.Daily.UniqueClicks != hourlyValue.Sum(h => h.UniqueClicks) ||
          adStat.Daily.SocialUniqueImpressions != hourlyValue.Sum(h => h.SocialUniqueImpressions) ||
          adStat.Daily.SocialUniqueClicks != hourlyValue.Sum(h => h.SocialUniqueClicks);
    }

我也喜欢Ani的想法,它甚至允许从外部注入额外的条件。