2008-08-12 13 views
69

私は最近、C#でちょっとびっくりしています。一般的なコレクションでは少し混乱しています。ツリーの先頭がキーの値のペアであって、その下にキーの値のペアのリストが1つあります(ただし、これよりもレベルはありません)。これは適切でしょうか?キーバリューペアデータ構造の最適な実装ですか?

public class TokenTree 
{ 
    public TokenTree() 
    { 
     /* I must admit to not fully understanding this, 
     * I got it from msdn. As far as I can tell, IDictionary is an 
     * interface, and Dictionary is the default implementation of 
     * that interface, right? 
     */ 
     SubPairs = new Dictionary<string, string>(); 
    } 

    public string Key; 
    public string Value; 
    public IDictionary<string, string> SubPairs; 
} 

実際にはデータを渡すためのシンプルなシャントです。

答えて

132

ありKeyValuePairと呼ばれる実際のデータ型があり、この

KeyValuePair<string, string> myKeyValuePair = new KeyValuePair<string,string>("defaultkey", "defaultvalue"); 
+1

これは、いくつかの入力を節約し、すべてをもっと明瞭にするために、 "using"ステートメント(古いtypedefに似ています)でうまくいきます。 eを常時使用している場合。 g。 (文字列、文字列)のペア。 –

+8

KeyValuePair NAME_HERE =新しいKeyValuePair <文字列、文字列>( "defaultkey"、 "defaultvalue"); – HasanAboShally

+1

@AndreasReiffのコメントを拡張するには、 'NameValuePair = System.Collections.Generic.KeyValuePair ;を使用して'(文字列、文字列) '構造体を必要とする各ファイルの先頭近くに展開します。私の名前空間に 'class NameValuePair'を作るほうが便利だと分かったが、' public class NameValuePair \t { \t \t KeyValuePair it; \t \t公共のNameValuePair(文字列名、文字列値)が新しいKeyValuePair <文字列、文字列>(名前、値)= \t \t { \t \t \t。 \t \t \t \t公開ストリング名{get {return it.Key; }} \t \t公開ストリング値{get {return it.Value; }} \t} ' – ToolmakerSteve

1

Dictionary Classのように使用することは正しい、正確に何をしたいです。

フィールドは、IDictionaryの代わりにDictionaryとして直接宣言できますが、それはあなた次第です。

5

組み込みタイプのKeyValuePairがあります。実際には、これは、IDictionaryが反復処理を行う際にアクセスするためのものです。

また、この構造はほとんどツリーではなく、より代表的な名前を見つけることは良い練習になるかもしれません。

public class TokenTree : Dictionary<string, string> 
{ 
    public IDictionary<string, string> SubPairs; 
} 

これはあなたのルールを適用する必要がないという利点があります:あなたができる

12

一つの可能​​なことは自分自身の変更とそれを拡張まっすぐボックスのうち、Dictionaryオブジェクトを使用していますあなたのキーのIDictionary(例えば、キーの一意性など)。

そして、うん、あなたは、コンストラクタの概念Jay Mooney @右:)

2

を得た:.NETのジェネリック辞書クラスがちょうど固定タイプで、実際にハッシュテーブルです。

表示されているコードでは、両方の種類のコードを両方の種類で使用できるため、辞書の代わりにHashtableを使用するようにユーザーに納得させるべきではありません。ハッシュテーブルのために

:辞書については

foreach(object key in h.keys) 
{ 
    string keyAsString = key.ToString(); // btw, this is unnecessary 
    string valAsString = h[key].ToString(); 

    System.Diagnostics.Debug.WriteLine(keyAsString + " " + valAsString); 
} 

foreach(string key in d.keys) 
{ 
    string valAsString = d[key].ToString(); 

    System.Diagnostics.Debug.WriteLine(key + " " + valAsString); 
} 

そしてKeyValuePairと他の1のためのちょうど同じだけのHashtableのための非ジェネリックバージョンを使用して、のための一般的なバージョン辞書。

HashtableはKeyとValueの両方にObjectを使用しています。これは、すべての値型をボックス化し、型の安全性を持たないことを意味し、Dictionaryはジェネリック型を使用します。

1

使用このような何か:

class Tree <T> : Dictionary < T, IList< Tree <T> > > 
{ 
} 

それは醜いですが、私はそれが何をしたいあなたを与えるだろうと思います。 KeyValuePairが密封されています。

3

これに追加するだけのこと(他の人があなたの質問に答えてくれたとは思いますが)。拡張性のために(ある時点でそれが起こることをすべて知っているから)Composite Patternをチェックアウトしたいと思うかもしれません。「ツリーのような構造」を扱うのに理想的です。

私は言ったように、 (あなたの文字通りの実装は質問のように)私はあなたが後になるかもしれないものだと思う_^^

7

を一つだけサブレベルを期待しているが、あなたは、後で拡張する必要がある場合、これは本当にあなたのために有用である可能性がある:

pubic class TokenTree 
{ 
    public TokenTree() 
    { 
     tree = new Dictionary<string, IDictionary<string,string>>(); 
    } 

    IDictionary<string, IDictionary<string, string>> tree; 
} 

あなたは実際にあなたの質問のキー値の「リスト」と言っていましたので、内部のIDictionaryを:

関連する問題