使用字典作为其他字典中的键

时间:2009-01-11 18:30:18

标签: c# dictionary

我想在另一个Dictionary中使用TKey作为Dictionary。类似于python的东西。我试过这个,但它给了我错误。

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 个答案:

答案 0 :(得分:10)

它给你带来了什么错误?它是否抱怨你在第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;

但是很难确定。

答案 1 :(得分:6)

只是把它放在那里,我经常发现处理复杂的词典就像你描述的那样,用它们使用真实姓名要好得多,而不是试图让代码的读者对它进行排序。

根据个人喜好,您可以采取以下两种方式之一。使用using语句创建编译器别名。请注意,您必须使用完全限定类型名称,因为这是编译器别名。

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> { ... }

这样做可以让您和您的代码的读者更容易理解您正在做的事情。我的一般经验法则是,如果我正在创建一个泛型的泛型,那么就应该考虑建立一些一等公民来代表我的逻辑。

答案 2 :(得分:4)

这是因为“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;

但我不确定,这是你真正想要/需要的。