首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在C#中在开关中使用小数范围是不可能的吗?

在C#中在开关中使用小数范围是不可能的吗?
EN

Stack Overflow用户
提问于 2010-05-30 09:01:05
回答 4查看 15.3K关注 0票数 19

我刚开始学习C#,我已经被一些非常基础的东西卡住了。

对于我的第一个“应用程序”,我想我应该选择一些简单的东西,所以我决定使用一个BMI计算器。

BMI被计算成decimal类型,我现在正尝试在switch语句中使用它,但是decimal显然不能用于switch?

针对此问题的C#解决方案是什么:

代码语言:javascript
复制
            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;
            }
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-05-30 09:18:14

switch语句仅支持integral types (枚举未列出,但可以与switch语句一起使用,因为它们由整数类型支持)(字符串也受支持,如Changeling所指出的-参见注释以供参考)和常量值的相等比较。因此,您必须使用一些if语句。

代码语言:javascript
复制
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。我认为人们应该只使用一种类型的比较,以使代码更容易理解或重新排序检查,并且不要使用落差。

代码语言:javascript
复制
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.
}
票数 15
EN

Stack Overflow用户

发布于 2010-05-30 09:28:20

你的进一步阅读部分,

开关只能在值或事例上操作,因此输入值是一个常量值,开关可以像索引一样查找该值,并执行在事例或事例点或事例标签中定义的附加代码,无论所有这些都可以互换使用。

在第一个示例中,将y更改为true,开关应在'b‘上操作。

第二个示例之所以有效,是因为第二种情况是在常量或'const‘值上进行切换。因此,您满足了基本条件或交换机需要的条件。尽管这里的许多人肯定会告诉你不要像这样编写代码。打开一个简单的常量值,并确保您的开关准确地迎合了您提供的变量的每个不同值。

尝试使用枚举使您的代码符合标准的.Net编码实践。如果您想以此为职业,请确保不要染上任何坏习惯?

请记住:您可以使用枚举并将其设置为使用十进制值,因为decimal是一种值类型,因此这符合枚举所需的标准。因为枚举在.Net框架中被定义为值类型,所以只有像基于数字的类型这样的值类型才能在yuor自定义代码类中创建枚举类型。只需将每个值附加一个名称或上面使用的某种类型,如over weight等,并确保枚举中的每个条目都有一个逻辑顺序。也就是说,以十进制值表示的条目有一个明确的向上或向下的定义。设置枚举后,创建一个您刚刚创建的枚举类型的变量,然后将此变量提供给您的交换机。

祝你学习愉快。

票数 1
EN

Stack Overflow用户

发布于 2010-05-30 09:16:31

您还可以使用某种类型的集合来存储截止值和描述。(我不是C#专家...也许是Dictionary<decimal,string>?)遍历它以找到最后一个小于您的bmi的值,并返回其对应的标签。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2937154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档