我有这段代码:
switch (currentLetter)
{
case 'A': return 'B';
case 'B': return 'C';
case 'C': return 'D';
case 'D': return 'E';
case 'E': return 'F';
case 'F': return 'G';
case 'G': return 'H';
case 'a': return 'b';
case 'b': return 'c';
case 'c': return 'd';
case 'd': return 'e';
case 'e': return 'f';
case 'f': return 'g';
case 'g': return 'h';
}
我想到了许多方法来改变它,但我不确定选择哪种方式。我可以用(char)(currentLetter + 1)
替换所有返回,使用带有ASCII值的if语句来确定范围,然后执行(char)(currentLetter + 1)
,使用Enumerable.Range.Contains
然后查看值是否在范围内,替换用if等转换
这段代码不会在其他任何地方重复出现,我不确定这是不是最好的方式,因为代码的读者对于正在发生的事情非常清楚,他们不需要思考字符代码,算术等等。此外,永远不会再有任何字符添加到case语句中,因此它不会变得笨拙。
不确定我是应该保留原样还是更改它。
答案 0 :(得分:5)
离开它。
代码中的代码清晰度代码不会在整个代码库中复制/粘贴,通常比“优雅”解决方案更可取,因为可能有其他人可能最终需要维护它(或者你自己试图记住你正在做的事情。稍后。
如果你正在寻找迭代器类型的函数 - 这里有一个关于SO的函数:How to find out next character alphabetically?
答案 1 :(得分:1)
使用
return (char)(currentLetter + 1);
如果您需要进行范围测试
if ("ABCDEFGabcdefg".Contains(currentLetter)) {
return (char)(currentLetter + 1);
}
throw new ArgumentOutOfRangeException(
"Letter in the range 'A'-'G' or 'a'-'g' expected.");
立即可见,返回字母表中的下一个字母而不检查一长串案例。它也不容易出错。
更新:char
被认为是C#中的数字类型,可以隐式转换为至少16位宽的其他数字类型。您甚至可以对它们应用递增和递减运算符。因此,存在没有铸造的较短解决方案:
return ++currentLetter;
注意:这会更改currentLetter
的原始值,但由于char
不是引用类型,如果currentLetter
是方法参数,这应该不是问题。此外,必须使用预增量运算符,因为旧值将使用后增量运算符返回!
答案 2 :(得分:0)
使用ASCII代码和描述性方法名称,以便将来的开发人员清楚。甚至将它转换为扩展方法。即使你目前没有计划在其他地方改变或使用它,但并不意味着你将来不会。
答案 3 :(得分:0)
这只是一个品味问题。怎么样:
if (currentLetter >= 'A' && currentLetter <= 'G'
|| currentLetter >= 'a' && currentLetter <= 'g')
{
++currentLetter;
return currentLetter;
}
这假设currentLetter
是一个本地变量(它没有被当前方法之外引用的匿名函数捕获),因为我增加了它。