正在更新C#列表中的类别百分比
本文关键字:百分比 列表 更新 | 更新日期: 2023-09-27 17:59:26
我正在开发一个费用跟踪应用程序,用户在该应用程序中输入信息并在后端进行一些分析。每个费用分录有四个元素——日期、类别、金额和备注。它们被输入到一个类别列表中,该列表中的条目有名称、总数和百分比。目前,当在费用列表中创建新条目时,会触发一个事件,查看类别名称是否存在。如果是,则将金额添加到类别合计中。如果没有,则会在类别列表中添加一个新条目。所有类别总数的总和也作为一个单独的变量保存。
为了更新每个类别的百分比,我在事件的末尾有一个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
如果不使CategoryPercent
成为CategoryEntry
的属性,问题可能会消失。如果一个CategoryEntry
具有一个属性,指示它所代表的总数的百分比,那么在某种意义上,它"知道"其他类别。
如果一个单独的CategoryEntry
必须属于多个集合,那就更令人困惑了。那么CategoryPercent
将引用哪个集合?CategoryPercent
实际上是CategoryEntry
和类别列表的函数。
由于这是一个计算值——用户输入的是金额,而不是总额的百分比——所以在你需要的时候计算它可能更有意义
如果SingleMonthCategories
是List<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()
一次,然后将所有单个类别除以一个数量。