首页 > 解决方案 > 如何将一系列 if 语句转换为 for 或 foreach 循环?

问题描述

我正在为我正在学习的课程学习 C#。我目前的任务是建立一个健身房会员表格。我让它工作了,但我一直认为必须有更好的方法来完成我的一项功能。

我有一份健身房的额外清单:

每个都有一个相关的值。如果检查饮食,则将 20 美元添加到基本会员资格等中。目前,我将其设置为这样(有效):

private double calculateExtra()
    {           
        //this section adds extra charges to the base membership cost

        extraCost = 0;
        if (accessCheck.Checked)
        {
            extraCost += 1;
        }
        if (personalTrainerCheck.Checked)
        {
            extraCost += 20;
        }
        if (dietConsultCheck.Checked)
        {
            extraCost += 20;
        }
        if (fitnessVidCheck.Checked)
        {
            extraCost += 2;
        }
        return extraCost;
    }    

有人可以帮我理解如何将其更改为 for 循环或 foreach 循环吗?我一直在寻找;我尝试将其作为数组进行,但对需要添加的值等感到困惑。

按下计算按钮后,输出将进入表单上的文本框。

标签: c#

解决方案


在这里要做的最简单的事情是引入一个可枚举的(列表、数组等)来捕获您的复选框和额外的成本:

var checks = new []
{
    new { CheckBox = accessCheck, ExtraCost = 1, },
    new { CheckBox = personalTrainerCheck, ExtraCost = 20, },
    new { CheckBox = dietConsultCheck, ExtraCost = 20, },
    new { CheckBox = fitnessVidCheck, ExtraCost = 2, },
};

现在很容易加起来额外的成本:

var extraCost = 0;
foreach (var check in checks)
{
    if (check.CheckBox.Checked)
    {
        extraCost += check.ExtraCost;
    }
}
return extraCost;

现在,如果你想让它更精简一点,那么你可以用这个替换这个计算:

return checks.Aggregate(0, (a, x) => x.CheckBox.Checked ? x.ExtraCost : 0);

出现的下一个问题是条件变得更加复杂,例如healthCheck.Checked && dietConsultCheck.Checkedor location == "CBD" && fitnessVidCheck.Checked。然后你可以这样做:

var checks = new (Func<bool> Condition, int ExtraCost)[]
{
    (() => accessCheck.Checked, 1),
    (() => personalTrainerCheck.Checked, 20),
    (() => healthCheck.Checked && dietConsultCheck.Checked, 20),
    (() => location == "CBD" && fitnessVidCheck.Checked, 1),
};
return checks.Aggregate(0, (a, x) => x.Condition() ? x.ExtraCost : 0);

最后,

如果您希望能够更改检查的内容,如果您从数组更改为列表并提升checks为字段,则可以在运行时构建它。

private List<(Func<bool> Condition, int ExtraCost)> _checks = null;

然后,在启动时,您可以设置默认值:

_checks = new List<(Func<bool> Condition, int ExtraCost)>()
{
    (() => accessCheck.Checked, 1),
    (() => personalTrainerCheck.Checked, 20),
    (() => healthCheck.Checked && dietConsultCheck.Checked, 20),
    (() => location == "CBD" && fitnessVidCheck.Checked, 1),
};

现在,您可以随意添加更多内容:

_checks.Add((() => monthlySpecialCheck.Checked, -10));

推荐阅读