В какой-то момент во время моего приложения я столкнулся с необходимостью иметь три строковых ключа для экземпляра класса (я использую C# 3.5, поэтому я не мог использовать кортеж). Глядя в Интернете, я наткнулся на этот ответ код которого я использовал: https://stackoverflow.com/a/15804355/5090537Правильное использование пользовательской структуры данных для многопользовательского словаря
После пошива свои биты и куски для моих нужд, в конце концов, мой пользовательский класс выглядел следующим образом:
public class MultiKeyDictionary<K1, K2, K3, V> : Dictionary<K1, MultiKeyDictionary<K2, K3, V>>
{
public V this[K1 key1, K2 key2, K3 key3]
{
get
{
return ContainsKey(key1) ? this[key1][key2, key3] : default(V);
}
set
{
if (!ContainsKey(key1))
this[key1] = new MultiKeyDictionary<K2, K3, V>();
this[key1][key2, key3] = value;
}
}
public bool ContainsKey(K1 key1, K2 key2, K3 key3)
{
return base.ContainsKey(key1) && this[key1].ContainsKey(key2, key3);
}
public void Add(K1 key1, K2 key2, K3 key3, V value)
{
if (!ContainsKey(key1))
this[key1] = new MultiKeyDictionary<K2, K3, V>();
if (!this[key1].ContainsKey(key2, key3))
this[key1][key2] = new Dictionary<K3, V>();
this[key1][key2][key3] = value;
}
}
Это работало отлично подходит для мои потребности, но у меня есть несколько вопросов по этой структуре данных:
1) Поскольку я действительно наследую от Dictionary(K1, Dictionary(K2, V))
, правильно ли предположить, что для меня реализовано GetHashCode
, и мне не нужно указывать отдельную реализацию ? И то же самое для Равных?
2) Является ли также предпосылкой, что мне нужно было создать свой собственный пользовательский класс правильно? Так как я не мог использовать строковый массив или список строк, например, потому что тогда было бы сравнение ReferenceEquals
вместо того, чтобы мне было необходимо сравнение попорядка (ключ1 равен ключу1, key2, равному ключу2, и key3, равному ключу3)?
Использование словаря, YourClass> 'прямое решение или вы можете использовать' List > 'также –
Monah
@HadiHassan: Это было специально в вопросе - класс «Tuple» недоступен до C# 4. –
@GaryMcGill Я думаю, что Tuple для 3 ключей можно сделать легко, но я не думаю, что построить структуру данных (словарь словаря словаря) для представления данных с 3 ключами является хорошим выбором здесь (использовать или реализовать с нуля. Класс кортежа, который принимает 3 ключа и одно значение объекта, проще и прямолинейно). Я не внимательно прочитал вопрос, прямо прочитал код и ниже. – Monah