如果我有以下抽象数据结构:
"blue", ["sky", "water", "blueberry"]
"green", ["grass", "frog", "lime", "leaf"]
"red", ["blood", "apple", "ruby", "firetruck"]
"purple", ["plum", "petunia"]
如果我想要检索"键"通过传入数组中的一个匹配值,哪种数据结构最能支持此操作?我正在寻找易用性(例如干净的代码)和效率的组合。
自提出以来:密钥和值是唯一的,任何密钥中都不会重复两个值(例如,任何地方都没有重复)。
这就是我这样做的方式,但我很确定这不是最好的方式,因为您应该通过访问该值来使用词典。关键,而不是相反。
public class ContainerClass
{
private static Dictionary<string, string[]> Data { get; set; }
static ContainerClass()
{
Data = new Dictionary<string, string[]>
{
{"blue", new string[] {"sky", "water", "blueberry"}},
{"green", new string[] {"grass", "frog", "lime", "leaf"}},
{"red", new string[] {"blood", "apple", "ruby", "firetruck"}},
{"purple", new string[] {"plum", "petunia"}}
};
}
public static string GetValue(string lookup)
{
foreach(var item in Data)
{
if (item.Value.Contains(lookup))
{
return item.Key;
}
}
return null;
}
}
使用示例:
ContainerClass.GetValue("lime"); // Should return 'green'
答案 0 :(得分:3)
从您提供的信息来看,似乎最简单的解决办法就是像这样反转字典:
static ContainerClass()
{
Data = new Dictionary<string, string>
{
{"sky", "blue"},
{"water", "blue"},
{"blueberry", "blue"},
{"grass", "green"},
...
{"blood", "red"},
...
{"plum", "purple"},
...
};
}
这样你就可以查找这样的值:
public static string GetValue(string lookup)
{
string result;
Data.TryGetValue(lookup, out result);
return result;
}
当然,您可以使用一点Linq从普通的“前进”字典中生成这个“倒置”字典:
var keyValueDict = new Dictionary<string, string[]>
{
{"blue", new string[] {"sky", "water", "blueberry"}},
{"green", new string[] {"grass", "frog", "lime", "leaf"}},
{"red", new string[] {"blood", "apple", "ruby", "firetruck"}},
{"purple", new string[] {"plum", "petunia"}}
};
var valueKeyDict = keyValueDict
.SelectMany(x => x.Value, Tuple.Create)
.ToDictionary(t => t.Item2, t => t.Item1.Key);
这将生成一个与上面指定的字典相同的字典。