如何在C#中使用嵌套字典?

3

我的要求是:

Dictionary<outerString, Dictionary<innerString, List<SelectListItem>>>

当我尝试使用键(outerString)获取内部字典的值时,它会出现错误,提示“无法应用索引类型的表达式...............”。
我已经尝试过这个方法。
Dictionary<outerString, Dictionary<innerString, List<SelectListItem>>> dict1 = new
    Dictionary<outerString, Dictionary<innerString, List<SelectListItem>>>;

Dictionary<innerString, List<SelectListItem>> dict2 = dict1.values["outerString"];

任何快速的帮助都将不胜感激。
提前致谢。

3
字典<外部字符串, 字典<内部字符串, 列表<SelectListItem>>> 天哪!!! - Darin Dimitrov
1
这绝对是使用 var 的好地方。 - Brian Rasmussen
什么是内部字符串和外部字符串? - Tomas Vana
你可能只需要写 String 而不是 outerString 和 innerString。请注意,在类型签名中,您必须提供类型而不是变量。 - JacquesB
您可能想要引入一个或两个类来封装该数据结构。嵌套泛型只是手动代码混淆! - Jørn Schou-Rode
innerStringouterString 是类型吗?将类/结构名称的第一个字母大写是一种常见惯例。 - Dan Tao
7个回答

6
我猜您所需要的只是:

我想您需要的是:

Dictionary<innerString, List<SelectListItem>> dict = dict1["someKey"];

3
您只需更改代码片段的最后一行为以下内容(我假设您在写内部字符串和外部字符串时意思是字符串):
var dict = dict1["someValue"];

此外,您可以使用 var 关键字使您的代码更易读:
var dict1 = new Dictionary<string, Dictionary<string, List<SelectListItem>>>();
var dict = dict1["someValue"];

2
你离正确答案很近:
Dictionary<outerString, Dictionary<innerString, List<SelectListItem>>> dict1 = new 
Dictionary<outerString, Dictionary<innerString, List<SelectListItem>>>(); 

// Get inner dictionary whose key is "someValue"
Dictionary<innerString, List<SelectListItem>> dict = dict1["someValue"]

2

那么outerStringinnerString类型吗?你是否只是想要一个嵌套的字典string -> string -> List<SelectListItem>?如果不是,您需要向我们展示这些类型的定义,并让编译器找到一种从您正在尝试索引的string转换的方法...


1

我误解你了吗?这个能正常工作

Dictionary<string, Dictionary<string, List<string>>> list = new Dictionary<string, Dictionary<string, List<string>>>();
list.Add("test", new Dictionary<string, List<string>>());
Dictionary<string, List<string>> inner = list["test"];

或者

var list = new Dictionary<string, Dictionary<string, List<string>>>();
list.Add("test", new Dictionary<string, List<string>>());
Dictionary<string, List<string>> inner = list["test"];

感谢astander和其他人的快速回复。 我之前写的是list.values["test"]; 但实际需要的是 list["test"]; - kumar

0

Dictionary<string, Dictionary<string, List<T>> dict1 = 
    new Dictionary<string, Dictionary<string, List<T>>();

你需要

List<T> list12 = dict1["key1"]["key2"];

List<int> list1 = new List<int>();
list1.Add(1);
list1.Add(2);

Dictionary<string, List<int>> innerDict = new Dictionary<string, List<int>>();
innerDict.Add("inner", list1);

Dictionary<string, Dictionary<string, List<int>>> dict1 =
    new Dictionary<string, Dictionary<string, List<int>>>();
dict1.Add("outer", innerDict);

List<int> list2 = dict1["outer"]["inner"];

0
你可以尝试使用字符串数组作为键,而不是嵌套字典。
       Dictionary<string[], List<string>> dict = 
           new Dictionary<string[],List<string>>();

       string[] key = {"inner", "outer"};
       List<string> vals = new List<string>();

       dict.Add(key, vals);

1
字典依赖于Equals和GetHashCode方法的语义,而这两种方法都没有在数组上实现。换句话说:var x = new string[] { "one", "two" };var y = new string[] { "one", "two" };Console.WriteLine("x == y? {0}", x.Equals(y));输出:x == y? False - Logicalmind

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