3

IDがメソッドに渡される次のようなことを行う最良の方法は何ですか. ケースステートメントは大丈夫ですか、それともハッシュテーブルのようなコレクションの方が良いですか?

private string GetCurrencySymbol(string code)
    {
        switch (code)
        {
            case "USD":
            case "AUD":
            case "CAD":
            case "NAD":
            case "NZD":
            case "SGD":
            case "HKD":
                return "$";
            case "GBP":
                return "£";
            case "NOK":
            case "DKK":
            case "SEK":
                return "kr";
            case "ZAR":
                return "R";
            case "JPY":
                return "¥";
            case "CHF":
                return "CHF";
            case "EUR":
                return "€";
            case "GHS":
                return "¢";
            case "BWP":
                return "P";
            case "INR":
                return "₹";
            case "KES":
                return "KSh";
            case "LSL":
                return "L";
            case "MUR":
                return "Rs";
            case "NGN":
                return "₦";
            case "MWK":
                return "MK";
            case "MZM":
                return "MT";
            case "PKR":
                return "Rs";
            case "PLN":
                return "zł";
            case "SZL":
                return "L";
            case "TZS":
                return "Sh";
            case "UGX":
                return "Sh";
            case "ZMK":
                return "ZK";
            default:
                return "";
        }
    }

これはちょっと臭うような?それほど頻繁にアクセスされるわけではありませんが、少し冗長に見えます。

4

6 に答える 6

5

ステートメントは最終的には最終的switchに翻訳されDictionaryます。多くの場合、より複雑な例 (この例など) では、直接それに進むことが理にかなっています。

Dictionary<string, string> currencyLookup = new Dictionary<string, string>();
currencyLookup["USD"] = "$";
//...

string currency = currencyLookup["INR"];

辞書を使用する利点のいくつか:

  1. すべてのオプションをリテラルとして定義する場合は、必要なコードが少し少なくなる可能性があります。(特に、コレクション初期化子を使用する場合。)
  2. コードですべてのマッピングを定義する必要がないように、ファイル、データベース、またはその他の外部ソースの情報に基づいてディクショナリを作成できます。これにより、コードがよりきれいになるだけでなく、プログラムを再コンパイルする必要なく、通貨を追加/削除/変更できます。
  3. ContainsKey特定のキーが見つからない場合に空の文字列を返すだけでなく、特定のキーが存在するかどうかを知るなどの操作にアクセスできます (これは引き続き行うことができます)。
于 2012-12-05T18:32:06.830 に答える
1

動的ルックアップが必要でない限り、 aswitchは通常少なくとも a を打ち負かしますDictionary(コンパイラは、Dictionaryよりパフォーマンスが高いと判断した場合に a を生成するため)

しかし、最も重要な指標はユーザビリティです。コードは現在の形式で読みやすいと思いますか?

別の補足として、誰かのグローバリゼーション手法を使用して、この特定の重労働をあなたに代わって行うことはできますか?

于 2012-12-05T18:31:30.653 に答える
1

辞書クラスの方が優れています。ヘルパーに入れることができます。ですが、使用頻度は少ないのでスイッチは悪くありません。

于 2012-12-05T18:31:44.730 に答える
1

ケースステートメントはあなたの場合に最適です。

于 2012-12-05T18:31:03.850 に答える
1

あなたは使用することができます

Dictionary<String, char>

ただし、同様に見えるマッピングをセットアップする必要があります。

この一連のキー/値が決して変更されない場合、そこにあるような case ステートメントを使用しても問題はありません。他のクラスから時折アクセスされる場合は、静的ユーティリティ クラスのどこかに貼り付けます。

于 2012-12-05T18:31:06.880 に答える
1

List<>orを使用するDictionary<,>と、ユーザーが通貨を設定できるようにする必要がない限り、そのような単純なアプリケーションでは完全にやり過ぎになります (その場合はDictionary<,>-class の使用をお勧めします)。

あなたのスイッチケースは、粗く見えても、このような単純な機能には問題ありません。

于 2012-12-05T18:33:12.420 に答える