148

s からs への定数(実行時に変更されない) マッピングを作成する最も効率的な方法は何ですか?stringint

const Dictionaryを使用してみましたが、うまくいきませんでした。

適切なセマンティクスを使用して不変のラッパーを実装できますが、それでも完全には正しくないようです。


質問された方のために、私は生成されたクラスにIDataErrorInfoを実装しており、columnName を記述子の配列にルックアップする方法を探しています。

スイッチが文字列を受け入れることを知らなかった (テスト時のタイプミス! ああ!) ため、それを使用します。ありがとう!

4

11 に答える 11

197

C# で真にコンパイル時に生成される定数ディクショナリを作成するのは、実際には簡単な作業ではありません。実際、ここでの答えはどれも実際にそれを達成していません.

必ずしも良いものではありませんが、要件を満たすソリューションが 1 つあります。C# 仕様によると、スイッチ ケース テーブルは定数ハッシュ ジャンプ テーブルにコンパイルされることに注意してください。つまり、一連の if-else ステートメントではなく、定数辞書です。したがって、次のような switch-case ステートメントを検討してください。

switch (myString)
{
   case "cat": return 0;
   case "dog": return 1;
   case "elephant": return 3;
}

これはまさにあなたが望むものです。そして、はい、私は知っています、それは醜いです。

于 2008-11-06T10:26:21.503 に答える
40

現在のフレームワークには、貴重な不変コレクションがいくつかあります。.NET 3.5 の比較的簡単なオプションを 1 つ思いつくことができます。

使用Enumerable.ToLookup()-Lookup<,>クラスは不変です (ただし、rhs では多値です)。あなたはDictionary<,>非常に簡単にこれを行うことができます:

    Dictionary<string, int> ids = new Dictionary<string, int> {
      {"abc",1}, {"def",2}, {"ghi",3}
    };
    ILookup<string, int> lookup = ids.ToLookup(x => x.Key, x => x.Value);
    int i = lookup["def"].Single();
于 2008-11-06T09:45:26.297 に答える
16
enum Constants
{
    Abc = 1,
    Def = 2,
    Ghi = 3
}

...

int i = (int)Enum.Parse(typeof(Constants), "Def");
于 2008-11-06T09:57:52.293 に答える
12

これは、「CONST Dictionary」に最も近いものです。

public static int GetValueByName(string name)
{
    switch (name)
    {
        case "bob": return 1;
        case "billy": return 2;
        default: return -1;
    }
}

コンパイラは、コードをできるだけきれいに構築するのに十分なほどスマートです。

于 2008-11-06T10:39:12.023 に答える
1

ディクショナリ用の標準の不変インターフェイスはないようです。残念ながら、ラッパーを作成することが唯一の合理的なオプションのように思えます。

編集: Marc Gravell が、私が見逃した ILookup を見つけました。これにより、.ToLookup() を使用して Dictionary を変換する必要がありますが、少なくとも新しいラッパーの作成を回避できます。

これが特定のシナリオに限定された必要性である場合は、よりビジネス ロジック指向のインターフェイスを使用する方がよい場合があります。

interface IActiveUserCountProvider
{
    int GetMaxForServer(string serverName);
}
于 2008-11-06T09:43:14.773 に答える
-2

なぜだめですか:

public class MyClass
{
    private Dictionary<string, int> _myCollection = new Dictionary<string, int>() { { "A", 1 }, { "B", 2 }, { "C", 3 } };

    public IEnumerable<KeyValuePair<string,int>> MyCollection
    {
        get { return _myCollection.AsEnumerable<KeyValuePair<string, int>>(); }
    }
}
于 2010-07-27T12:48:25.027 に答える