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

3

我希望在另一个Dictionary中使用Dictionary作为TKey,类似于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;

1
你的最后一行有多个错误。你两次引用了dict,其中一个应该是对dict2的引用。(重要教训:给变量起一个清晰的名称!)而且你有一个没有匹配的左大括号。 - abelenky
3个回答

10

它给你的是什么错误?它是否在抱怨你在第4行缺少括号?

第4行看起来应该是:

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

然而,你可能是想要这个,因为"abc"不是字典的key:

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

但是dict2["abc"]是一个字符串,而字典的键应该是一个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

只是想提一下,我经常发现处理像你描述的复杂字典时,最好使用真实名称而不是让代码读者自己解决。

您可以根据个人喜好以两种方式之一来实现。要么使用using语句创建编译器别名。请注意,由于这是编译器别名,因此必须使用完全限定的类型名称。

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

或者你可以采用全面的方式,实际上创建一个继承自字典的类。
class ComplexKey : Dictionary<String, String> { ... }
class ComplexType : Dictionary<ComplexKey, String> { ... }

这样做可以使您和代码读者更容易地理解您正在做什么。我的一般准则是,如果我正在创建一个通用的泛型,那么现在是时候考虑构建一些一流的实体来代表我的逻辑了。


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;

但我不确定这是否是您真正想要/需要的。


我刚刚也在打同样的东西.. +1 :) - Steven Robbins
好的,但是我如何从内部字典中获取特定的键值对呢? 我不想为外部字典中的每个值创建内部字典。 - kamilwydrzycki
对我来说,dict[dict2["abc"]] = 20 更有意义 - user1228

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接