2016-07-31 30 views
0

我正在開發一個費用跟蹤應用程序,其中用戶輸入信息並在後端完成一些分析。每個費用條目都有四個元素 - 日期,類別,金額和評論。這些被輸入到一個分類列表中,其條目有一個名稱,總數和百分比。目前,在費用列表中創建新條目時,會觸發一個事件,查看是否存在類別名稱。如果是這樣,金額將被添加到類別總額中。如果沒有,則將新條目添加到類別列表中。所有類別總數的總和也作爲一個單獨的變量保存。更新C#列表中的類別百分比

爲了更新每個類別的百分比,我在遍歷列表中的每個元素的事件結尾處都有一個for循環。它將所有類別的總和除以所有總數的總和,然後再乘以100.這樣可以完成工作,但對於每項條目都做了太多工作,似乎對我來說很渺茫。任何人都可以推薦一種更有效的方法來做到這一點?我在下面包括事件代碼,但可以根據需要提供更多信息。

public void SelectedExpenseEntry_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) 
{ 
     ExpenseEntry dummyEntry = (ExpenseEntry)sender; 

     if ((dummyEntry.ExpenseDate != "MM/DD/YYYY") && (dummyEntry.ExpenseCategory != "Category") && (dummyEntry.ExpenseAmount != 0) && (dummyEntry.ExpenseComment != "Comment")) 
     { 
      CategoryEntry TemperCategory = new CategoryEntry(); 
      ExpenseEntry TempExpenseEntry = new ExpenseEntry(); 
      TempExpenseEntry = dummyEntry; 
      TemperCategory.CategoryName = TempExpenseEntry.ExpenseCategory; 
      TemperCategory.CategoryTotal = TempExpenseEntry.ExpenseAmount; 
      TemperCategory.CategoryPercent = 0; 

      ListTotal = ListTotal + TempExpenseEntry.ExpenseAmount; 

      int index = SingleMonthsCategories.IndexOf(SingleMonthsCategories.Where(x => x.CategoryName == TemperCategory.CategoryName).FirstOrDefault()); 
      if(index == -1) 
      { 
       SingleMonthsCategories.Add(TemperCategory); 
      } 
      else 
      { 
       SingleMonthsCategories[index].CategoryTotal = SingleMonthsCategories[index].CategoryTotal + TemperCategory.CategoryTotal; 
      } 

      for (int i = 0; i < SingleMonthsCategories.Count; i++) 
      { 
       SingleMonthsCategories[i].CategoryPercent = (SingleMonthsCategories[i].CategoryTotal/ListTotal) * 100; 
      }; 

     } 
} 

由於提前,

Yusif Nurizade

+0

您每次顯示它們時都重新計算百分比嗎?如果有的話,你應該考慮將它們緩存在字典中。 –

+0

「不成熟的優化是萬惡之源」 - Donald Knuth –

回答

0

的問題可能會消失,如果你不做出CategoryPercentCategoryEntry的屬性。如果一個CategoryEntry有一個屬性指示它代表的總數的百分比,那麼在某種意義上它「知道」其他類別。

如果個人CategoryEntry曾經屬於多個集合,它會變得更加混亂。那麼CategoryPercent指的是哪個集合? CategoryPercent實際上是CategoryEntry的分類列表的功能。

由於這是一個計算值 - 用戶輸入金額,而不是總金額的百分比 - 所以在您需要時計算它可能更有意義。

如果SingleMonthCategoriesList<CategoryEntry>(只是猜測),那麼你可以創建一個類,並添加一個方法,返回所有類別的總和。您也可以創建一個函數,返回給定條目的總數的百分比。

public class CategoryEntries : List<CategoryEntry> 
{ 
    public decimal TotalExpense() 
    { 
     return this.Select(category => category.ExpenseAmount).Sum(); 
    } 

    public decimal PercentOfTotal(CategoryEntry entry) 
    { 
     return entry.TotalExpense/TotalExpense(); 
    } 
} 

如果列表中有數千個條目,則此方法可能會變得效率低下。否則,根據需要計算總數將會很快。如果您需要立即計算百分比數,則可以始終撥打TotalExpense()一次,然後將所有單個類別除以該數額。