0

我有这个代码:

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 语句中,因此它不会变得笨拙。

不知道我应该保持原样还是改变它。

4

4 回答 4

5

别管它。

当可能有其他人最终可能不得不维护它(或者你自己试图记住你在做什么)稍后。

如果您正在寻找一种迭代器类型的函数 - 这里有一个:如何按字母顺序查找下一个字符?

于 2012-09-26T17:13:09.433 回答
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.");

可以立即看到,返回字母表中的下一个字母,而无需检查一长串案例。而且它更不容易出错。


UPDATE:char在 C# 中被认为是数字类型,可以隐式转换为至少 16 位宽的其他数字类型。您甚至可以对它们应用递增和递减运算符。因此存在一个没有强制转换的更短的解决方案:

return ++currentLetter;

注意:这会改变 的原始值currentLetter,但由于char不是引用类型,如果currentLetter是方法参数,这应该不是问题。此外,必须使用前增量运算符,因为旧值将与后增量运算符一起返回!

于 2012-09-26T17:15:16.870 回答
0

使用 ASCII 代码和描述性方法名称,以便未来的开发人员清楚。甚至把它变成一个扩展方法。即使您目前没有计划在其他地方更改或使用它,但这并不意味着您将来不会。

于 2012-09-26T17:15:35.090 回答
0

这只是口味问题。怎么样:

if (currentLetter >= 'A' && currentLetter <= 'G'
  || currentLetter >= 'a' && currentLetter <= 'g')
{
  ++currentLetter;
  return currentLetter;
}

这假设currentLetter是一个局部变量(它没有被当前方法之外引用的匿名函数捕获),因为我增加了它。

于 2012-09-26T17:30:44.500 回答