Лучшая реализация структуры данных пары ключевых значений?
-
08-06-2019 - |
Вопрос
Итак, в последнее время я немного покопался в C#, и все общие коллекции меня немного смутили.Скажем, я хотел представить структуру данных, в которой главой дерева была пара «ключ-значение», а под ней был один необязательный список пар «ключ-значение» (но не более уровней, чем эти).Это подойдет?
public class TokenTree
{
public TokenTree()
{
/* I must admit to not fully understanding this,
* I got it from msdn. As far as I can tell, IDictionary is an
* interface, and Dictionary is the default implementation of
* that interface, right?
*/
SubPairs = new Dictionary<string, string>();
}
public string Key;
public string Value;
public IDictionary<string, string> SubPairs;
}
На самом деле это всего лишь простой шунт для передачи данных.
Решение
Существует реальный тип данных под названием KeyValuePair, используйте его следующим образом.
KeyValuePair<string, string> myKeyValuePair = new KeyValuePair<string,string>("defaultkey", "defaultvalue");
Другие советы
Один из возможных вариантов — использовать объект Dictionary прямо из коробки, а затем просто расширить его своими собственными изменениями:
public class TokenTree : Dictionary<string, string>
{
public IDictionary<string, string> SubPairs;
}
Это дает вам преимущество: вам не нужно применять правила IDictionary для вашего ключа (например, уникальность ключа и т. д.).
И да, вы правильно поняли концепцию конструктора :)
Я думаю, что вам может быть нужно (как буквальная реализация вашего вопроса):
public class TokenTree
{
public TokenTree()
{
tree = new Dictionary<string, IDictionary<string,string>>();
}
IDictionary<string, IDictionary<string, string>> tree;
}
Вы на самом деле сказали «список» значений «ключ-значение» в своем вопросе, поэтому, возможно, вы захотите поменять местами внутренние IDictionary
с:
IList<KeyValuePair<string, string>>
Существует встроенный тип KeyValuePair.Фактически, это то, к чему IDictionary предоставляет вам доступ, когда вы выполняете в нем итерацию.
Кроме того, эта структура вряд ли является деревом, поэтому поиск более репрезентативного имени может быть хорошим упражнением.
К этому можно добавить только одно (хотя я думаю, что на ваш вопрос уже ответили другие).В интересах расширяемости (поскольку мы все знаем, что в какой-то момент это произойдет) вы можете проверить Составной узор Это идеально подходит для работы с «Древовидными структурами».
Как я уже сказал, я знаю, что вы ожидаете только один подуровень, но это может быть действительно полезно для вас, если вам позже понадобится расширить ^_^
@Джей Муни:Общий класс Dictionary в .NET на самом деле представляет собой хеш-таблицу, только с фиксированными типами.
Показанный вами код не должен никого убеждать использовать Hashtable вместо Dictionary, поскольку оба фрагмента кода могут использоваться для обоих типов.
Для хеш-таблицы:
foreach(object key in h.keys)
{
string keyAsString = key.ToString(); // btw, this is unnecessary
string valAsString = h[key].ToString();
System.Diagnostics.Debug.WriteLine(keyAsString + " " + valAsString);
}
Для словаря:
foreach(string key in d.keys)
{
string valAsString = d[key].ToString();
System.Diagnostics.Debug.WriteLine(key + " " + valAsString);
}
И то же самое для другого с KeyValuePair, просто используйте неуниверсальную версию для Hashtable и общую версию для Dictionary.
Так что это так же просто в обоих направлениях, но Hashtable использует Object как для ключа, так и для значения, что означает, что вы будете упаковывать все типы значений, и у вас нет безопасности типов, а Dictionary использует общие типы и, следовательно, лучше.
Класс словаря это именно то, что вы хотите, правильно.
Вы можете объявить поле непосредственно как Dictionary, а не IDictionary, но это на ваше усмотрение.
Используйте что-то вроде этого:
class Tree < T > : Dictionary < T, IList< Tree < T > > >
{
}
Это некрасиво, но я думаю, это даст вам то, что вы хотите.Жаль, что KeyValuePair запечатана.