79

そのため、私は最近 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;
}

これは、データをやり取りするための単純なシャントにすぎません。

4

8 に答える 8

140

KeyValuePair と呼ばれる実際のデータ型があり、このように使用します

KeyValuePair<string, string> myKeyValuePair = new KeyValuePair<string,string>("defaultkey", "defaultvalue");
于 2008-08-12T13:20:55.127 に答える
13

できることの 1 つは、Dictionary オブジェクトを箱から出してそのまま使用し、独自の変更を加えて拡張することです。

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

これにより、キーに IDictionary の規則 (キーの一意性など) を適用する必要がないという利点が得られます。

そして、あなたはコンストラクタの概念を正しく理解しました:)

于 2008-08-12T13:25:12.903 に答える
7

(質問の文字通りの実装として)あなたが求めているのは次のとおりだと思います。

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

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

あなたは実際にあなたの質問でキー値の「リスト」を言ったので、内部を次のように交換したいかもしれませんIDictionary:

IList<KeyValuePair<string, string>>
于 2008-08-12T13:45:53.470 に答える
5

KeyValuePair 組み込み型があります。実際のところ、これは IDictionary を反復するときにアクセスできるものです。

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

于 2008-08-12T13:23:27.777 に答える
3

これに追加することは1つだけです(ただし、他の人がすでに質問に答えていると思いますが)。拡張性のために (ある時点でそれが起こることは誰もが知っているので)、複合パターンを確認することをお勧めします。これは、「ツリーのような構造」で作業するのに理想的です。

私が言ったように、あなたが 1 つのサブレベルだけを期待していることは知っていますが、後で拡張する必要がある場合、これは本当に役に立ちます ^_^

于 2008-08-12T13:45:50.210 に答える
2

@ Jay Mooney : .NET のジェネリック Dictionary クラスは、実際には固定型のハッシュ テーブルです。

あなたが示したコードは、両方のコード部分が両方のタイプに使用できるため、辞書の代わりに 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 には非ジェネリック バージョンを使用し、Dictionary にはジェネリック バージョンを使用します。

したがって、どちらの方法でも同じように簡単ですが、Hashtable はキーと値の両方に Object を使用します。つまり、すべての値の型をボックス化することになり、型の安全性がなくなり、Dictionary はジェネリック型を使用するため、より優れています。

于 2008-08-12T13:25:56.710 に答える
1

辞書クラスはまさにあなたが望むものです、正しいです。

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

于 2008-08-12T13:22:01.287 に答える
1

次のようなものを使用します。

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

醜いですが、あなたが望むものを与えると思います。残念ながら KeyValuePair は封印されています。

于 2008-08-12T13:38:47.243 に答える