2011-12-14 6 views
1

私はC#でアプリケーションを作成しています。そのアプリケーションでは、私は1000,2000,3000などのような別のポートからデータを取得している辞書ランタイムを作成したい。ここで私はDictionary1000、Dictionary2000、Dictionary3000などのような名前でランタイムを作成したいが、私は午前それをすることはできません。私を助けてください。 ありがとうございます。C#で辞書にランタイム名を付けるには?

+1

について、あなたは何辞書を話しています? –

+0

申し訳ありませんダニー、あなたの質問を理解することは難しいです。たぶん私たちにいくつかのコードを説明するのに役立つだろうか? –

+0

ここで私の辞書は辞書に似ていますが、その特定のポートから受信したデータを保存しています。簡単に区別するために、辞書名の名前にポート番号を追加します。 – Dany

答えて

8

インデックス付けの変数名を指定しないでください。辞書の辞書を使う。

+0

私は多くのポートからデータを取得しているので、各ポートの辞書を区別する最も簡単な方法を教えてください – Dany

+0

これはあなたにすでに与えられています:) Dictionary.TryGetValue :)ポート番号は外部辞書のキーでなければなりません – surfen

2
public class NamedDictionary<TKey,TValue> : Dictionary<TKey,TValue> { 
    public string Name {get;set;} 
} 

...?

3

この種のアプローチはあまり実用的ではありません。なぜ辞書の辞書を使用しないのですか?ような何か:

Dictionary<int, Dictionary<SomeType,SomeOtherType>> 

ので、あなたはまた、複合キーを保持している新しいタイプを作成することによって問題を解決することができ、質問

+0

本当に便利です – Dany

1

の各ポートに対して辞書を格納することができます。

public class PortDictionary 
{ 
    private Dictionary<CompositeKey, MyValueType> _store = new Dictionary<CompositeKey, MyValueType>(); 

    public void Add(int port, MyKeyType key, MyValueType value) 
    { 
     _store.Add(new CompositeKey(port, key), value); 
    } 

    public void Remove(int port, MyKeyType key) 
    { 
     _store.Remove(new CompositeKey(port, key)); 
    } 

    public bool TryGet(int port, MyKeyType key, out MyValueType value) 
    { 
     return _store.TryGetValue(new CompositeKey(port, key), out value); 
    } 

    private class CompositeKey : IEquatable<CompositeKey> 
    { 
     private int _port; 
     private MyKeyType _key; 

     public CompositeKey(int port, MyKeyType key) 
     { 
      _port = port; 
      _key = key; 
     } 

     #region IEquatable<IdentityKey> Members 

     public bool Equals(CompositeKey other) 
     { 
      if (_port != other._port) { 
       return false; 
      } 
      return _key == other._key; 
     } 

     #endregion 

     public override int GetHashCode() 
     { 
      return _port.GetHashCode()^_key.GetHashCode(); 
     } 
    } 
} 

この実装では、複合キーはポート辞書内に隠されているローカルクラスです。複合キーはIEquatable <>を実装する必要があり、辞書のキーとして使用できるようにGetHashCode()をオーバーライドする必要があります。 、物事を簡単にするトリック

var dict = new PortDictionary(); 
dict.Add(3000, myKey, myValue); 

//Retrieve 
if (dict.TryGet(3000, myKey, out myValue)) { 
    Console.WriteLine("Value = {0}", myValue); 
} else { 
    Console.WriteLine("No value found for port {0} and key {1}", 3000, myKey); 
} 
0

[]これを上書きすることである:ここで

は、このポートの辞書を使用する方法の一例である

public class InnerDictionary : Dictionary<int, string> 
{ 
} 

public class OuterDictionary : Dictionary<int, InnerDictionary> 
{ 
    public new InnerDictionary this[int key] 
    { 
     get 
     { 
      if (!base.ContainsKey(key)) 
      { 
       base.Add(key, new InnerDictionary()); 
      } 

      return base[key]; 
     } 

     set { throw new NotSupportedException("Message"); } 
    } 
} 
関連する問題