如何在c#中为字典赋予运行时名称?

时间:2011-12-14 14:28:53

标签: c#

我在c#中申请。在那个应用程序中我想创建字典运行时间。这里我从不同的端口获取数据,如1000,2000,3000等。这里我想创建字典运行时间的名称为Dictionary1000,Dictionary2000,Dictionary3000等。但我是不能这样做。请帮我。    提前致谢。

5 个答案:

答案 0 :(得分:8)

永远不要为索引编制变量名称。使用字典字典。

答案 1 :(得分:3)

这种方法不太实用。为什么不使用字典词典?类似的东西:

Dictionary<int, Dictionary<SomeType,SomeOtherType>>

因此您可以针对每个有问题的端口存储字典

答案 2 :(得分:2)

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

...

答案 3 :(得分: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&lt;&gt;并且必须覆盖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);
}

答案 4 :(得分: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"); }
    }
}