используя словарь в качестве ключа в другом словаре - PullRequest
1 голос
/ 11 января 2009

Я хотел бы использовать Dictionary как TKey в другом Dictionary. Нечто похожее на питона. Я пробовал это, но это дает мне ошибки.

Dictionary<Dictionary<string, string>, int> dict = new Dictionary<Dictionary<string,    string>, int>();
Dictionary<string, string> dict2 = new Dictionary<string, string>();
dict2["abc"] = "def";
dict[dict["abc"] = 20;

Ответы [ 3 ]

10 голосов
/ 11 января 2009

Какую ошибку это дает вам? Вы жалуетесь на отсутствующую скобку в строке 4?

Строка 4 выглядит так, как должно быть:

dict[dict["abc"]] = 20;

Однако, вы, вероятно, имеете в виду это, поскольку «abc» не является ключом к dict:

dict[dict2["abc"]] = 20;

Но dict2["abc"] - это string, когда ключом dict считается Dictionary<string, string>.

Но давайте еще раз рассмотрим вашу первоначальную цель, прежде чем углубляться по этому пути. Вы не должны использовать изменяемые типы в качестве ключей словаря.

Это может быть код, который вы ищете:

Dictionary<string, int> dict  = new Dictionary<string, int>();
Dictionary<string, string> dict2 = new Dictionary<string, string>();
dict2["abc"] = "def";
dict[dict2["abc"]] = 20;

Но трудно сказать наверняка.

6 голосов
/ 11 января 2009

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

Вы можете сделать это одним из двух способов в зависимости от личных предпочтений. Либо с помощью оператора using для создания псевдонима complier. Обратите внимание, что вы должны использовать полное имя типа, так как это псевдоним компилятора.

using ComplexKey = System.Collections.Generic.Dictionary<String, String>;
using ComplexType = System.Collections.Generic.Dictionary<
   System.Collections.Generic.Dictionary<String, String>,
   String
   >;

Или вы можете пойти полным путем и создать класс, унаследованный от Dictionary.

class ComplexKey : Dictionary<String, String> { ... }
class ComplexType : Dictionary<ComplexKey, String> { ... }

Делая это, вам и читателю вашего кода будет намного легче понять, что вы делаете. Моё общее эмпирическое правило: если я создаю общий тип, то самое время взглянуть на создание первоклассных граждан, которые скорее представляют мою логику.

4 голосов
/ 11 января 2009

Это потому, что "dict [" abc "] не словарь, а" строка ".

Правильно, что вы спросили:

Dictionary<Dictionary<string, string>, int> dict = new Dictionary<Dictionary<string,    string>, int>();
Dictionary<string, string> dict2 = new Dictionary<string, string>();
dict2["abc"] = "def";
dict[dict2] = 20;

Но я не уверен, это то, что вам действительно нужно / нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...