2011-08-31 48 views
0

我需要根据列的名称得到列的总和。目前,我正在使用一个IF ELSE块来处理它,但我希望有一个更自动的方法来完成这种事情。根据列名得到列的总和

什么工作:

foreach (var day in bydates) 
      { 
       var bymile_bydate = bymile.Where(x => x.Date == day).ToList(); 

       foreach (var r in results) 
       { 
        var name = r.name; 
        if (name.Equals("TotalIssues")) 
        { 
         r.data.Add(bymile_bydate.Sum(x => x.TotalIssues).Value); 
        } 
        else if (name.Equals("TotalCritical")) 
        { 
         r.data.Add(bymile_bydate.Sum(x => x.TotalCritical).Value); 
        } 
       } 
      } 

我多么希望得到它的工作:这样做的

 foreach (var day in bydates) 
     { 
      var bymile_bydate = bymile.Where(x => x.Date == day).ToList(); 

      foreach (var r in results) 
      { 
       r.data.Add(bymile_bydate.Sum(x=> x.(r.name)).Value); 
      } 
     } 

所以无论如何方式?

回答

2

C#没有很好的支持访问编译时不知道名字的成员。我会经常做这种情况是有名字的字典来代表返回的属性:

// assuming your objects are of type ClassX and your properties are decimals 
static Dictionary<string, Func<ClassX, decimal>> PropertyLookup = 
    new Dictionary<string, Func<ClassX, decimal>> 
    { { "TotalIssues", x => x.TotalIssues }, 
     { "TotalCritical", x => x.TotalCritical }, 
    }; 

foreach (var day in bydates) 
{ 
    var bymile_bydate = bymile.Where(x => x.Date == day).ToList(); 

    foreach (var r in results) 
    { 
     var name = r.name; 
     r.data.Add(bymile_bydate.Sum(PropertyLookup[name]).Value); 
    } 
} 

如果你不希望有预先定义的属性名称,你可以使用反射得到代表。下面是在像以前的解决方案字典高速缓存委托的实现:

// assuming your objects are of type ClassX and your properties are decimals 
static Dictionary<string, Func<ClassX, decimal>> PropertyLookup = 
    new Dictionary<string, Func<ClassX, decimal>>(); 

foreach (var day in bydates) 
{ 
    var bymile_bydate = bymile.Where(x => x.Date == day).ToList(); 

    foreach (var r in results) 
    { 
     var name = r.name; 
     if (!PropertyLookup.ContainsKey(name)) 
      PropertyLookup[name] = (Func<ClassX, decimal>)Delegate.CreateDelegate(
       typeof(Func<ClassX, decimal>), 
       typeof(ClassX).GetProperty(name).GetGetMethod()); 
     r.data.Add(bymile_bydate.Sum(PropertyLookup[name]).Value); 
    } 
} 
+0

听起来不错。我会尝试看看它现在是否可行:)谢谢! – Robodude

+0

如果您不想提前创建字典,那么我已经添加了一个使用Reflection的方法,它的速度一样快。 – Gabe

+0

更好,谢谢! :) – Robodude

0

没有反射,你不能用一个字符串值是指属性名称。在这里反思将是一个糟糕的选择。我建议在包含您的合计金额,做下面的类创建一个属性:

public int? RelevantTotal 
{ 
    get 
    { 
     switch (this.name) 
     { 
      case "TotalIssues": 
       return this.TotalIssues; 
      case "TotalCritical": 
       return this.TotalCritical; 
      default: 
       return 0; 
     } 
    } 
} 

的,当你遍历结果,调用属性,而不是:

foreach (var day in bydates) 
{ 
    var bymile_bydate = bymile.Where(x => x.Date == day).ToList(); 

    foreach (var r in results) 
    { 
     r.data.Add(bymile_bydate.Sum(x => r.RelevantTotal).Value); 
    } 
}