[英]What data structure should I use to look up a string from an array of possible strings?
如果我有以下抽象数据结构:
"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'
从您提供的信息来看,似乎最简单的解决方案是像这样反转字典:
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);
这将生成一个与上面指定的字典相同的字典。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.