我需要将查找表存储为我的一个类中的实例成员。构造对象时将初始化该表。每个“行”将有3个“列”:
StringKey (e.g., "car")
EnumKey (e.g., LookupKeys.Car)
Value (e.g, "Ths is a car.")
我想选择能够通过StringKey 或 EnumKey进行查找的最佳性能的数据结构。
对于相同的字典值,有两个键很尴尬。我以前从未遇到过这种情况,所以我想知道这类事情的标准是什么。
我可以创建一个Key / Value / Value结构,而不是Key / Key / Value,但我想知道会产生什么样的性能影响。
我是否认为这一切都错了?
答案 0 :(得分:5)
嗯......“错误”是一种苛刻的方式。我认为,因为最常见的字典是“单值键值”,并且为此提供了有效的数据结构(映射),所以通常最好只使用其中的两个,共享内存以获取值。尽可能。
答案 1 :(得分:4)
你有两个哈希图。
从StringKey到值。
一个从EnumKey到价值。
您不必复制所有Value实例,这些对象可以在两个哈希映射之间共享。
如果有很多项,您可能需要使用两个树图而不是两个哈希图。但基本原则(“分享价值观”)适用于两种结构。一组带有两个地图的值。
答案 2 :(得分:1)
是否真的有必要使用两种类型的密钥键入相同的结构?您可能不需要自己重建复杂的数据结构。您可以为查找表执行某种封装,这样如果内存不是问题,您确实有两个查找表。您可以使用此封装结构来模拟能够使用任一类型的键从“相同”结构中提取值。
OR
如果有一些方法可以在枚举值和字符串键之间进行映射,那么只需要一种查找表即可进入该路由。
答案 3 :(得分:0)
LINQ的ILookup(TKey,TElement)接口可能有所帮助。假设你的词典是这样的:
Dictionary<carKey, carValue> cars;
您可以使用:
ILookUp<carValue, carKey> lookup = cars.ToLookup(x => x.Value, x => x.Key);
(...实际上我认为我可能会略微误读这个问题 - 但ILookUp可能仍然适合该法案,但键/值集可能需要是密钥和枚举。)
答案 4 :(得分:0)
如果两种类型的密钥都保证可以访问每个值,则另一种想法是将一种类型的密钥转换为另一种密钥。例如:
public Value getValue(String key)
{
dictionary.get(key); // normal way
}
public Value getValue(Enum enumKey)
{
String realKey = toKey(enumKey);
getValue(realKey); // use String key
}
你可以让你的Enum实现一个返回其String键的toKey()方法,或者可能有另一个将Enum值映射到String对应的字典。