c# - 如何将一系列 if 语句转换为 for 或 foreach 循环?
问题描述
我正在为我正在学习的课程学习 C#。我目前的任务是建立一个健身房会员表格。我让它工作了,但我一直认为必须有更好的方法来完成我的一项功能。
我有一份健身房的额外清单:
- 24/7 访问
- 饮食咨询
- 租金
- PT
每个都有一个相关的值。如果检查饮食,则将 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 循环吗?我一直在寻找;我尝试将其作为数组进行,但对需要添加的值等感到困惑。
按下计算按钮后,输出将进入表单上的文本框。
解决方案
在这里要做的最简单的事情是引入一个可枚举的(列表、数组等)来捕获您的复选框和额外的成本:
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.Checked
or 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));
推荐阅读
- machine-learning - 我可以将提前停止合并到 keras 网格搜索中吗?
- javascript - 如何获取没有第二类名称的元素
- javascript - JavaScript 背景颜色切换
- php - 在mysql中选择起始数字后跟第一个单词
- android - 如何将图像文件从应用程序保存或移动到一般媒体文件夹
- apache - Apache 将用户名重定向到配置文件页面冲突
- javascript - 如何在 javascript 中将日期 mm/dd/yyyy 转换为 yyyy-mm-ddT00:00:00.000Z 格式
- python - 如何将python字典的某些键和值传递给HTML脚本
- powershell - 隐式 SMTP 替代方案
- javascript - 在 JavaScript 中,如何判断数组元素是空还是未定义?