我刚开始学习C#,我已经被一些非常基础的东西卡住了。
对于我的第一个“应用程序”,我想我应该选择一些简单的东西,所以我决定使用一个BMI计算器。
BMI被计算成decimal类型,我现在正尝试在switch语句中使用它,但是decimal显然不能用于switch?
针对此问题的C#解决方案是什么:
decimal bmi = calculate_bmi(h, w);
switch (bmi) {
case < 18.5:
bmi_description = "underweight.";
break;
case > 25:
bmi_description = "overweight";
case > 30:
bmi_description = "very overweight";
case > 40:
bmi_description = "extreme overweight";
break;
}
发布于 2010-05-30 09:18:14
switch
语句仅支持integral types (枚举未列出,但可以与switch
语句一起使用,因为它们由整数类型支持)(字符串也受支持,如Changeling所指出的-参见注释以供参考)和常量值的相等比较。因此,您必须使用一些if
语句。
if (bmi < 18.5M)
{
bmi_description = "underweight.";
}
else if (bmi <= 25)
{
// You missed the 'normal' case in your example.
}
else if (bmi <= 30)
{
bmi_description = "overweight";
}
else if (bmi <= 40)
{
bmi_description = "very overweight";
}
else
{
bmi_description = "extreme overweight";
}
顺便说一句,您的switch语句有点奇怪,因为您正在从小于切换到大于,并使用不间断的fall through。我认为人们应该只使用一种类型的比较,以使代码更容易理解或重新排序检查,并且不要使用落差。
if (bmi < 18.5M)
{
bmi_description = "underweight.";
}
else if (bmi > 40)
{
bmi_description = "extreme overweight";
}
else if (bmi > 30)
{
bmi_description = "very overweight";
}
else if (bmi > 25)
{
bmi_description = "overweight";
}
else
{
// You missed the 'normal' case in your example.
}
发布于 2010-05-30 09:28:20
你的进一步阅读部分,
开关只能在值或事例上操作,因此输入值是一个常量值,开关可以像索引一样查找该值,并执行在事例或事例点或事例标签中定义的附加代码,无论所有这些都可以互换使用。
在第一个示例中,将y更改为true,开关应在'b‘上操作。
第二个示例之所以有效,是因为第二种情况是在常量或'const‘值上进行切换。因此,您满足了基本条件或交换机需要的条件。尽管这里的许多人肯定会告诉你不要像这样编写代码。打开一个简单的常量值,并确保您的开关准确地迎合了您提供的变量的每个不同值。
尝试使用枚举使您的代码符合标准的.Net编码实践。如果您想以此为职业,请确保不要染上任何坏习惯?
请记住:您可以使用枚举并将其设置为使用十进制值,因为decimal是一种值类型,因此这符合枚举所需的标准。因为枚举在.Net框架中被定义为值类型,所以只有像基于数字的类型这样的值类型才能在yuor自定义代码类中创建枚举类型。只需将每个值附加一个名称或上面使用的某种类型,如over weight等,并确保枚举中的每个条目都有一个逻辑顺序。也就是说,以十进制值表示的条目有一个明确的向上或向下的定义。设置枚举后,创建一个您刚刚创建的枚举类型的变量,然后将此变量提供给您的交换机。
祝你学习愉快。
发布于 2010-05-30 09:16:31
您还可以使用某种类型的集合来存储截止值和描述。(我不是C#专家...也许是Dictionary<decimal,string>
?)遍历它以找到最后一个小于您的bmi的值,并返回其对应的标签。
https://stackoverflow.com/questions/2937154
复制相似问题