Intereting Posts
Почему этот проверенный расчет не выбрасывает OverflowException? Почему при сериализации я получаю исключение «System.StackOverflowException было необработанным»? Преобразование int в байт в C # Что такое «базовый class» для типов числовых значений C #? Сохранение агностики базы данных приложения (ADO.NET и инкапсулирующая логика БД) Могу ли я указать мой явный тип компаратора inline? SetText текстового поля во внешнем приложении. API Win32 Как использовать инъекцию зависимостей с платформой Entity Framework DbContext? Как записывать журналы из Startup.cs Как я могу расшифровать документ PDF с помощью пароля владельца? Запросить таблицу, в которой есть пробелы Как получить доступ и изменить значение элемента управления родительским окном из дочернего windows в C # Не удается получить / elmah на сервере с Elmah MVC? Как я могу получить список локальных пользователей Windows (только пользователи, которые появляются на экране входа в Windows) Глубокая копия с использованием Reflection в методе расширения для Silverlight?

Лучшая реализация для структуры данных пары ключевых значений?

Так что я немного зациклился на 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(); } public string Key; public string Value; public IDictionary SubPairs; } 

Это всего лишь простой шунт для передачи данных.

Существует фактический тип данных, называемый KeyValuePair, используйте это

 KeyValuePair myKeyValuePair = new KeyValuePair("defaultkey", "defaultvalue"); 

Одна возможная вещь, которую вы могли бы сделать, это использовать объект Dictionary прямо из коробки, а затем просто расширить его своими собственными модификациями:

 public class TokenTree : Dictionary { public IDictionary SubPairs; } 

Это дает вам преимущество в том, что вам не нужно применять правила IDictionary для вашего ключа (например, ключевая уникальность и т. Д.).

И вы поняли концепцию конструктора 🙂

Я думаю, что вы могли бы после (как буквальная реализация вашего вопроса):

 public class TokenTree { public TokenTree() { tree = new Dictionary>(); } IDictionary> tree; } 

Вы действительно сказали «список» ключевых значений в своем вопросе, поэтому вы можете захотеть поменять внутренний IDictionary на:

 IList> 

Существует встроенный тип KeyValuePair. На самом деле, это то, что IDictionary дает вам доступ к тому, когда вы повторяете его.

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

Только одно, чтобы добавить к этому (хотя я думаю, что вы уже ответили на свой вопрос другими). В интересах расширяемости (поскольку все мы знаем, что это произойдет в какой-то момент), вы можете захотеть проверить композитный шаблон. Это идеально подходит для работы с «Tree-Like Structures» ..

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

@ Jay Mooney : Общий class Dictionary в .NET на самом деле является hash-таблицей, только с фиксированными типами.

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

Для хеш-таблицы:

 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 как для ключа, так и для значения, что означает, что вы будете вводить все типы значений, и у вас нет безопасности типов, а словарь использует общие типы и, следовательно, лучше.

Класс словаря именно то, что вы хотите, правильно.

Вы можете объявить поле непосредственно как словарь, а не IDictionary, но это зависит от вас.

Используйте что-то вроде этого:

 class Tree < T > : Dictionary < T, IList< Tree < T > > > { } 

Это уродливо, но я думаю, это даст вам то, что вы хотите. Слишком плохо KeyValuePair запечатан.