C#中使用多维键的哈希表

88

我基本上是在寻找一种在C#中使用二维类型键访问哈希表值的方法。

最终,我将能够像这样做:

HashTable[1][false] = 5;
int a = HashTable[1][false];
//a = 5

这就是我一直在尝试做的...但没有成功

Hashtable test = new Hashtable();
test.Add(new Dictionary<int, bool>() { { 1, true } }, 555);
Dictionary<int, bool> temp = new Dictionary<int, bool>() {{1, true}};
string testz = test[temp].ToString(); 
16个回答

0

你可以尝试“双重嵌套”哈希表,也就是说,你的主字典的类型为Dictionary<int, Dictionary<bool, my_return_type>>

这样就能够实现你在第一个代码片段中使用双括号符号的目标。

当然,管理方面会有一些棘手的问题。每次添加条目时,你需要测试主字典是否包含主键的字典,如果没有,则添加一个新的字典,然后将次键和值添加到内部字典中。


0

你能使用一个 Dictionary<KeyValuePair<int,bool>,int> 吗?


0

将您的二维键包装在单独的类型中,并使用该类型作为键。还要考虑重写GetHashCode()Equals()方法。最好使用Dictionary<>而不是HashTable,因为显然您可以使用它。


0

看,这段代码完全正常运行:

    public Form1()
    {
            InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {

        this.Services = new Dictionary<object, Hashtable>();
        this.Services.Add("array1", new Hashtable());

        this.Services["array1"]["qwe"] = "123";
        this.Services["array1"][22] = 223;

        object zz = null;
        zz = this.Services["array1"]["qwe"];
        MessageBox.Show(zz.ToString()); // shows qwe

        zz = this.Services["array1"][22];
        MessageBox.Show(zz.ToString()); // shows 22
    }

现在我们只需要一个包装器来避免手动执行这个操作。Services.Add("array1", new Hashtable());

0
一个快速而简单的方法是从这两个信息中创建一个组合键,例如:
IDictionary<string, int> values = new Dictionary<string, int>();
int i = ...;
bool b = ...;
string key = string.Concat(i, '\0', b);
values[key] = 555;

为了更好地封装它,您可以将字典包装起来:
public class MyDict
{
    private readonly IDictionary<string, int> values = new Dictionary<string, int>();

    public int this[int i, bool b]
    {
        get
        {
            string key = BuildKey(i, b);
            return values[key];
        }

        set
        {
            string key = BuildKey(i, b);
            values[key] = value;
        }
    }

    private static string BuildKey(int i, bool b)
    {
        return string.Concat(i, '\0', b);
    }
}

为了使其更加健壮,将复合键封装为一种类型,例如一个包含两个字段的类,确保正确重写Equals()和GetHashCode()方法。

密钥的两个部分。在原始帖子中,这是整数1和布尔值false,因此我已经在示例代码中将它们连接起来。(在此示例中,分隔符并不是必需的。) - Paul Ruane

0

这是我的嵌套字典实现:

public class TwoKeysDictionary<K1, K2, T>:
        Dictionary<K1, Dictionary<K2, T>>
{
    public T this[K1 key1, K2 key2]
    {
        get => base.ContainsKey(key1) && base[key1].ContainsKey(key2) ? base[key1][key2] : default;
        set
        {
            if (ContainsKey(key1) && base[key1].ContainsKey(key2))
                base[key1][key2] = value;
            else
                Add(key1, key2, value);
        }
    }

    public void Add(K1 key1, K2 key2, T value)
    {
        if (ContainsKey(key1))
        {
            if (base[key1].ContainsKey(key2))
                throw new Exception("Couple " + key1 + "/" + key2 + " already exists!");
            base[key1].Add(key2, value);
        }
        else
            Add(key1, new Dictionary<K2, T>() { { key2, value } });
    }

    public bool ContainsKey(K1 key1, K2 key2) => ContainsKey(key1) && base[key1].ContainsKey(key2);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接