5

我需要将查找表作为实例成员存储在我的一个类中。构造对象时将初始化该表。每个“行”将有 3 个“列”:

StringKey (e.g., "car")
EnumKey (e.g., LookupKeys.Car)
Value (e.g, "Ths is a car.")

我想选择能够通过 StringKeyEnumKey 进行查找时产生最佳性能的数据结构。

对于相同的字典值有 2 个键有点尴尬。我以前从未遇到过这种情况,所以我想知道这种事情的标准是什么。

我可以创建一个键/值/值结构而不是键/键/值,但我想知道这会产生什么样的性能影响。

我在想这一切都错了吗?

4

5 回答 5

5

嗯......“错误”是一种苛刻的说法。我认为,因为最常见的字典是“值的单键”,并且为此(映射)提供有效的数据结构付出了很多努力,所以通常最好只使用其中的两个,共享值的内存,如果完全有可能。

于 2009-03-13T15:26:02.623 回答
4

你有两个哈希图。

  • 一个从 StringKey 到 value。

  • 一个从 EnumKey 到 value。

您不必复制所有 Value 实例,这些对象可以在两个 hashmap 之间共享。

如果项目很多,您可能希望使用两个树形图而不是两个哈希图。但基本原则(“分享价值观”)适用于这两种结构。一组带有两个映射的值。

于 2009-03-13T15:31:55.463 回答
1

真的有必要用两种类型的键键入相同的结构吗?您可能不需要自己重建复杂的数据结构。您可以对查找表进行某种封装,以便在内存不是问题的情况下真正拥有两个查找表。您可以使用此封装结构来模拟能够使用任一类型的键从“相同”结构中提取值。

或者

如果有某种方法可以在枚举值和字符串键之间进行映射,那么您可以只使用一种类型的查找表就可以走这条路。

于 2009-03-13T15:36:34.907 回答
0

LINQ 的 ILookup(TKey, TElement) 接口可能会有所帮助。假设您的字典类似于:

Dictionary<carKey, carValue> cars;

你可以使用:

ILookUp<carValue, carKey> lookup = cars.ToLookup(x => x.Value, x => x.Key);

(......实际上我认为我可能稍微误读了这个问题 - 但 ILookUp 可能仍然符合要求,但键/值集可能需要是键和枚举。)

于 2009-03-13T16:11:19.067 回答
-1

如果保证每个值都可以被两种类型的键访问,另一种想法是将一种类型的键转换为另一种类型的键。例如:

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 实现一个 toKey() 方法来返回它们的 String 键,或者可能有另一个字典将 Enum 值映射到 String 对应项。

于 2009-03-13T16:51:25.523 回答