Hashtable с многомерным ключом в C # - PullRequest
60 голосов
/ 27 марта 2009

Я в основном ищу способ доступа к значению хеш-таблицы, используя двумерный типизированный ключ в 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 голосов
/ 13 марта 2010

Смотри, этот код работает просто отлично:

    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
    }

Теперь нам просто нужна оболочка, чтобы не делать этого вручную.

0 голосов
/ 27 марта 2009

Быстрый и грязный способ - создать составной ключ из двух частей информации, например,

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 ().

0 голосов
/ 27 марта 2009

Вот пример , вы можете использовать обычный Hashtable вместо того, который я использовал.

0 голосов
/ 27 марта 2009

Оберните ваш двумерный ключ в отдельный type и используйте этот тип в качестве ключа. Также рассмотрите возможность переопределения GetHashCode() и Equals() методов. Желательно использовать Dictionary<> вместо HashTable, так как, очевидно, вы можете использовать это.

0 голосов
/ 27 марта 2009

Не могли бы вы использовать Dictionary<KeyValuePair<int,bool>,int>?

0 голосов
/ 27 марта 2009

Вы могли бы иметь возможность «двойного вложения» ваших хеш-таблиц - другими словами, ваш основной словарь имеет тип Dictionary<int, Dictionary<bool, my_return_type>>.

Это позволяет достичь цели использования двойных скобок в вашем первом фрагменте кода.

Конечно, сторона управления немного сложнее. Каждый раз, когда вы добавляете запись, вам нужно проверить, содержит ли основной словарь словарь для первичного ключа, и добавить новый словарь, если нет, затем добавить вторичный ключ и значение во внутренний словарь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...