首页 > 解决方案 > 如何在 C# 中创建字段名称的动态总计?

问题描述

我的用户可以创建任意数量的“活动”对象。我需要编写一些代码来遍历每个“Activity”对象并根据每个“ActivityType”字段计算“Hours”字段。如果任何字段的总小时数超过 60,则会引发错误。(可选:显示导致错误的 ActivityType)

例子:

{
    "Activity1": {
        "ActivityType": "Swimming",
        "Hours": 40,
    },
    "Activity2": {
        "ActivityType": "Cycling",
        "Hours": 20,
    }
    "Activity3": {
        "ActivityType": "Cycling",
        "Hours": 50,
    }
    "Activity4": {
        "ActivityType": "Baseball",
        "Hours": 20,
    }
    "Activity5": {
        "ActivityType": "Baseball",
        "Hours": 20,
    }
}

游泳总数:40 自行车总数:70 <- 验证错误消息棒球总数:40

我的代码以前是按人计算的,但现在应该按活动计算。此代码不会为每个 Activity 保留一个计数,而是为页面上的所有 Activity 保留一个计数。所以“foreach (var person in Persons)”是可以改变的。

foreach (var person in Persons.Where(x => x.IsActive == true))
    {
       if (Activities.Where(x => x.ActivityType > 0).Sum(Y => Y.Hours) > 60)
           validations.Add(string.Format("Each activity may only have up to 60 hours per week."));
    }
)

每个 Activity 应该有一个总数,而不是 150 个。

标签: c#asp.net-mvclinq

解决方案


你的意思是这样的,它使用分组吗?

public class Person
{
    public bool IsActive { get; set; }
    public List<Activity> Activities { get; set; }
    public string Name { get; set;}
}

public class Activity
{
    public string ActivityType { get; set; }
    public uint Hours { get; set; }
}

public class Example
{
    private const uint Threshold = 60;
    public void CheckHours(IEnumerable<Person> persons)
    {
        foreach (var person in persons)
        {
            var grouped = (from a in person.Activities
                group a by a.ActivityType
                into groupedActivities
                    select new { Activity = groupedActivities.Key, TotalHours = groupedActivities.Sum(g => g.Hours)}).ToList();

            foreach (var group in grouped)
            {
                if(group.TotalHours > Threshold)
                    throw new Exception($"Activity {group.Activity} for person {person.Name} has exceeded the threshold!");
            }

        }
    }
}

CheckHours 方法将为总小时数 > 60 的人的任何活动引发异常。


推荐阅读