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

Так что в последнее время я немного ковыряюсь в 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;
}

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

12.08.2008 13:12:50
8 ОТВЕТОВ
РЕШЕНИЕ

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

KeyValuePair<string, string> myKeyValuePair = new KeyValuePair<string,string>("defaultkey", "defaultvalue");
137
18.09.2013 21:12:17
Это прекрасно работает с выражением «using» (аналогично старому typedef), чтобы сэкономить время при наборе текста и сделать все более понятным. Если вы постоянно используете, например, пару (строка, строка).
Andreas Reiff 6.12.2012 09:58:41
KeyValuePair <строка, строка> NAME_HERE = new KeyValuePair <строка, строка> ("defaultkey", "defaultvalue");
HasanAboShally 29.01.2013 12:23:04
Чтобы расширить комментарий @AndreasReiff: using NameValuePair = System.Collections.Generic.KeyValuePair<string, string>;в верхней части каждого файла, который нуждается в (string, string)структуре. Хотя мне было удобнее создать class NameValuePairв моем пространстве имен: public class NameValuePair { KeyValuePair<string, string> it; public NameValuePair( string name, string value ) { it = new KeyValuePair<string, string>( name, value ); } public string Name { get { return it.Key; } } public string Value { get { return it.Value; } } }
ToolmakerSteve 13.11.2015 18:28:56

Словарный класс это именно то, что вы хотите, правильно.

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

1
12.08.2008 13:22:01

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

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

5
12.08.2008 13:23:27

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

public class TokenTree : Dictionary<string, string>
{
    public IDictionary<string, string> SubPairs;
}

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

И да, вы поняли концепцию конструктора правильно :)

12
12.08.2008 13:25:12

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

2
23.05.2017 12:24:56

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

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

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

1
12.08.2008 13:41:59

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

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

3
12.08.2008 13:45:50

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

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

    IDictionary<string, IDictionary<string, string>> tree; 
}

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

IList<KeyValuePair<string, string>>
7
12.04.2018 13:45:21