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)、 if ステートメントを ASCII 値で使用して範囲を決定し(char)(currentLetter + 1)、 を使用Enumerable.Range.Containsして、値が範囲内にあるかどうかを確認し、スイッチを if に置き換えます。

このコードは他の場所で繰り返されることはありません。コードの読者には何が起こっているのかが非常に明確であり、文字コードを考える必要がないため、これが最善の方法ではないかどうかはわかりません。 、算術など。また、case ステートメントに追加する文字がこれ以上ないため、扱いにくくなりません。

そのままにするか、変更するか迷っています。

4

4 に答える 4

5

それを残します。

コードベース全体でコピー/貼り付けされないパフォーマンス指向のコードセクションのコードの明瞭さは、通常、それを維持しなければならない誰かがいる可能性がある場合 (または自分自身が維持しようとしている場合)、「エレガントな」ソリューションよりも望ましいです。あなたがしていたことを思い出してください)後で。

イテレータ タイプの関数を探している場合は、SO ここに 1 つあります:アルファベット順に次の文字を見つける方法は?

于 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: charC# では数値型と見なされ、少なくとも 16 ビット幅の他の数値型に暗黙的に変換できます。インクリメント演算子とデクリメント演算子を適用することもできます。したがって、キャストのない短いソリューションが存在します。

return ++currentLetter;

注: これにより の元の値が変更されますがcurrentLettercharは参照型ではないため、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 に答える