Лучшая реализация для структуры данных пары ключевых значений?
Так что я немного ковырялся с 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;
}
это всего лишь простой шунт для передачи данных.
8 ответов:
существует фактический тип данных под названием KeyValuePair, используйте так
KeyValuePair<string, string> myKeyValuePair = new KeyValuePair<string,string>("defaultkey", "defaultvalue");
одна возможная вещь, которую вы могли бы сделать, это использовать объект словаря прямо из коробки, а затем просто расширить его своими собственными модификациями:
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
С a:IList<KeyValuePair<string, string>>
есть встроенный тип KeyValuePair. На самом деле, это то, что IDictionary дает вам доступ, когда вы повторяете в нем.
кроме того, эта структура вряд ли является деревом, поиск более репрезентативного имени может быть хорошим упражнением.
только одна вещь, чтобы добавить к этому (хотя я думаю, что вы уже ответили на свой вопрос другими). В интересах расширяемости (так как мы все знаем, что это произойдет в какой-то момент) Вы можете проверить Составной Шаблон Это идеально подходит для работы с "древовидной структуры"..
Как я уже сказал, Я знаю, что вы ожидаете только один подуровень, но это может быть действительно полезно для вас, если вам позже понадобится расширить ^_^
@Джей Муни: общий класс словаря в .NET на самом деле является хэш-таблицей, только с фиксированными типами.
код, который вы показали, не должен убеждать кого-либо использовать Hashtable вместо словаря, так как оба фрагмента кода могут использоваться для обоих типов.
для хэш-таблицы:
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, а общая версия для словаря.
Так что это так же просто в обоих направлениях, но Hashtable использует объект как для ключа, так и для значения, что означает, что вы будете вставлять все типы значений, и у вас нет безопасности типов, а словарь использует общие типы и, следовательно, лучше.
Словарь Класс - это именно то, что вы хотите, правильно.
вы можете объявить поле непосредственно как словарь, а не IDictionary, но это зависит от вас.