Intereting Posts
Вход в учетную запись Google для интеграции в android Xamarin Связанные сетевые диски не могут быть указаны в C # Как использовать API контактов Google через аутентификацию Oauth2 Использование C # COM в неуправляемом проекте C ++ -> Исключение при первой возможности в 0x7697C41F (KernelBase.dll) Насколько большой скачок будет идти от C # до Objective C Тайм-аут нити в c # Добавить содержимое списка в другой список C # InvalidCastException пытается сбрасывать из вложенного int в нулевое перечисление Как использовать Marshal.getActiveObject (), чтобы получить 2 экземпляра запущенного процесса, который открывает два процесса Обновление изображения windows WPF из элемента меню, но не во время цикла while Как сравнить значения enum и int? Связывание WPF DataGridTextColumn не принимает десятичные знаки Ошибка пути BindingExpression Есть ли простой способ сравнения, если 2 XDocuments равны, игнорируя порядок элементов / атрибутов? Генетическое программирование в C #

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

Так что я немного зациклился на 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 запечатан.