正在更新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

正在更新C#列表中的类别百分比

如果不使CategoryPercent成为CategoryEntry的属性,问题可能会消失。如果一个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()一次,然后将所有单个类别除以一个数量。