2011-10-27 15 views
2

名前、オブジェクトのペアを格納する機能が必要です。任意のオブジェクトの辞書を作成する

objCと異なり##Dictionaryにはタイプが必要です。 objCでは、「任意のオブジェクト」を意味するのにidを使用します。

私はこれをC#でどのように管理できますか?

それでは、私が探していることは次のとおりです。

Dictionary<String,id>

申し訳ありませんが、これは本当に基本的な場合!

+3

'Dictionary 'を取得するためのキャストはありますか?値の型を使用する場合は、ボクシングの影響があります。 –

+0

ボクシングの意味は何ですか? 'オブジェクト'のほとんどは文字列になりますが、場合によっては、あなたが見る文字列を 'リスト表示する'ことがあります。 –

+0

@ThomasClayson: 'string'も' List 'も値の型ではないので、ボクシングは含まれません。 (あなたがそれを知らない場合はボクシングについての詳細を見つけるためにいくつかの検索を行う...) –

答えて

4

が強くオブジェクトのリストを入力した、これを達成する最も簡単な方法は、Dictionary<string, object>であり、あなたがそれを必要としてあなたのオブジェクト型をキャストする:

int i = (int)myDictionary["Age"]; 
string n = (string)myDictionary["Name"]; 

このようExpandoObjectとしてここではいくつかの動的なオプションがあります。

http://msdn.microsoft.com/en-us/library/system.dynamic.expandoobject.aspx

あなたがオブジェクトディクショナリのアプローチを行く場合は、boxing on value typesに注意を払います。動的アプローチを使用するとボクシングの影響はありませんが、実行時の解決が必要になります。そのため、パフォーマンスにはもう少しの影響があります。

何も無料ではありませんが、この小さなオーバーヘッドの影響は見られません。

0

アンボックスが問題になる場合は、常に.NET 4に新しいダイナミックタイプがあります。複数に話をするfafferyの場に行かなくても

0

わからない私が正しくあなたを理解していますが、次にすることができた場合:

 

    Dictionary s = new Dictionary(); 
    Object a = new Int32(); 
    a = 1; 
    Object b = new Double(); 
    b = 2.0; 
    s.Add("a", a); 
    s.Add("b", b); 
    Int32 v = Convert.ToInt32(s["a"]); 
    Double u = Convert.ToDouble(s["b"]); 
    Console.WriteLine(v + " " + u); 

-1

がこの背後に隠されたいくつかの悪いデザインがあるかもしれません示して尋ねます。これは、異種オブジェクトのコレクションが必要なときに常に実行されます。

コレクションにあるオブジェクトの種類がわからないため、コードの匂いであるif (dictionary["xy"] is string) {...}など、何らかの種類のチェックを行う必要があります。

共通のクラスにラッピングすることはオプションですか?そうすれば、共通の操作をいくつか指定することができます(同じdict内にある必要がある場合は、一般的な操作が必要になるため)。例えば、(擬似コードとしてそれを考慮)のようなもの:

class Base 
{ 
    bool IsCollection; 
} 

class StringItem : Base 
{ 
    string Contents; 
    IsCollection = false; 
    override ToString() { return this.Contents; } 
} 

class ListItem : Base 
{ 
    List<StringItem> Contents; 
    IsCollection = true; 
    override ToString() { return string.Join(",", this.Contents.ToArray() } 
} 

は、その後、あなたは、このようなToStringまたは任意のカスタムとしてベースに定義されているDictionary<string, Base>と利用事業を展開している可能性があります。

関連する問題