【发布时间】:2021-10-11 02:26:31
【问题描述】:
我是 C# 新手,想知道这段代码是否有更好的结构:
此代码根据捷克出生号码 = 捷克共和国的个人身份证号码确定真实月份。那里的数字是不变的。
private ushort RawMonth
// get raw integer month code without resolving it
{
get { return Convert.ToUInt16(SanitizedBirthNumberString.Substring(2, 2)); }
}
if (RawMonth >= 01 && RawMonth <= 12)
{
return RawMonth;
}
else if (RawMonth >= 51 && RawMonth <= 62)
{
return RawMonth - 50;
}
else if (RawMonth >= 21 && RawMonth <= 32)
{
return RawMonth - 20;
}
else if (RawMonth >= 71 && RawMonth <= 82)
{
return RawMonth - 70;
}
else
{
// just some of my custom exceptions
throw new MonthCodeInvalidException();
}
只有我一个人吗?因为那些 if-else 语句看起来已被弃用。谢谢。
我不得不进行一些重大调整,首先将 C# 语言版本设置为 9.0。
但最终,我有这段代码,它可以编译,我只是从未使用过这样的语法,请检查我,谢谢。
public ushort ResolvedMonth
{
get => RawMonth switch
{
>= 01 and <= 12 => RawMonth,
>= 21 and <= 32 => (ushort)(RawMonth - 20),
>= 51 and <= 62 => (ushort)(RawMonth - 50),
>= 71 and <= 82 => (ushort)(RawMonth - 70),
_ => throw new MonthCodeInvalidException()
};
}
有趣的是,为了运行它,我不得不使用 typecast,不知道为什么......但无论如何 - 看起来更整洁。
注意:它使用C# 9.0 introduced Relational patterns(链接到 MS C# 参考)。
【问题讨论】:
-
这里奇怪的不是 if 语句。
rawMonth是什么意思?为什么它可以大于 12?如果您解释这应该做什么,也许有更好的解决方案。 -
将所有这些三元组 (1,12,0), (51,62,50) ... 放入辅助表中并在表上方做一个 for
-
我投票结束这个问题,因为它要求改进工作代码 - 请在Code Review
-
捷克的出生号码是多少?问题的完整陈述可能会有所帮助。但如果那里没有模式 - 只需使用 if-else,无需过于复杂。
-
这不是我们需要的解释。我的意思是“它的第 3 位和第 4 位数字代表一个月,这就是我的示例中的
RawMonth。对于女性,50 被添加到月份数中,对于男性来说,它只是简单的月份数”。跨度>
标签: c# if-statement optimization