2011-08-31 70 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); 
    } 
}