2009-03-13 15 views
1

名前を値(1〜1)にマッピングするクラス(静的?)を作成したいと思います。このようなことをするにはどうすればよいでしょうか。C#で単純な名前値マッパークラスを作成する

public static class FieldMapper 
{ 
    public static GetValue(string Name) 
    { 
    if (Name == "abc") 
     return "Value1"; 

    if (Name == "def") 
     return "Value2"; 
    } 
} 

私は今日マインドブロックを持っているかもしれません。私はshouldn - すべての値がコンパイル時に知られている(別のキーと同じ値にマッピングすることはできません何の一意性がある):。私はこのような単純な問題:(

編集のためのクリーンな解決策を考えることができません「Tは、実行時に値を追加するデータ構造を作成すること。また、私は避けたいXMLファイルを使用して

答えて

0

コンパイル時に作成するのではなく、スイッチを使用するだけで済みます。

スイッチには複数の項目(IIRCが5つ)が含まれている場合、ハッシュルックアップを使用して実装されているため、多くのケースを入れても非常に高速です。 (つまり、アクセス時間はいずれのケースでも同じです)。

public static class FieldMapper { 

    public static string GetValue(string name) { 
     switch (name) { 
     case "abc": return "Value1"; 
     case "def": return "Value2"; 
     } 
     throw new ArgumentException("Unknown name.", "name"); 
    } 
} 
14

辞書のための仕事のようですね。

Dictionary<string, string> values = new Dictionary<string, string>(); 
values.Add("abc", "Value1"); 
values.Add("def", "Value2"); 
Console.WriteLine(values["abc"]); // Prints "Value1" 
+0

IDictionaryを継承するクラスですか?これらの値はすべてコンパイル時に認識されます。 – DotnetDude

+0

.Net 2以降では、System.Collections.Generic.Dictionary

0

コンパイル時にわかっている値については、リソースとして保存してみてください。

public static class FieldMapper 
{ 
    public static GetValue(string Name) 
    {  
     switch (Name) 
     { 
     case "abc": 
     return Value1; 
     } 
    } 
} 
+0

別名辞書かもしれませんか? – Svish

+0

あなたが投票した場合、なぜ私の答えが間違っているのかを教えてください。 –

+0

私はリストではありませんはhashlookupではありませんが、問題は解決しません – annakata

0

私は、辞書が良いだろうと思いますが、 - アイテムを辞書に読み込むと、かなり役に立ちます。

IDictionary<string, string> myValues = new Dictionary<string, string>(3) 
{ 
     {"abc", "Value1"}, 
     {"def", "Value2"}, 
     {"ghi", "Value3"} 
}; 

var mySearchString = "abc"; 
return myValues.Keys.Contains("abc") ? myValues[ mySearchString ] : string.Empty; 
1

あなたが事前にすることができた場合:このような何か:あなたはコードでそれをやろうとしていた場合

//Name Spaces Required 
using System.Resources; 
using System.Reflection; 

// Create the resource manager. 
Assembly assembly = this.GetType().Assembly; 

//ResFile.Strings -> <Namespace>.<ResourceFileName i.e. Strings.resx> 
resman = new ResourceManager("StringResources.Strings", assembly); 

// Load the value of string value for Client 
strClientName = resman.GetString("Client"); 

hereから盗まれた)

+0

辞書の要素数を指定する必要がありますか、これはオプションです。私は設計時にすべてのアイテムを知っていますが、ファイルを更新する開発者がいくつかあります。新しい辞書を追加する度に数字を増やすことを期待してエラーが発生しやすくなります。 – DotnetDude

+0

辞書は動的に容量を管理します。 –

+0

ロバートの権利。ディクショナリにはいくつかのオーバーロードがあります(それ以外の同様のコレクション型)。その1つでは、事前に項目数を知ることができます。このオーバーロードを使用できるのは、その数値がわかっていると、辞書がはるかに効率的になるからです。 – Boydski

関連する問題