某种类型的数据记录经常必须由唯一键索引。通常它看起来像这样(我使用 C# 因为它是我最熟悉的语言,但这个问题并不是针对它的):
public class NamedRecord
{
public readonly string UniqueImmutableName;
...
}
public class UsesUsualDict
{
Dictionary<string, NamedRecord> myDict = new Dictionary<string, NamedRecord>();
void AddRecord(NamedRecord _NewRecord)
{
myDict[_NewRecord.UniqueImmutableName] = _NewRecord;
}
NamedRecord GetRecord(string _Key)
{
return myDict[_Key];
}
}
然而,这似乎有点多余:该字典中的键应始终被视为等于
NamedRecord.UniqueImmutableName
,但开发者最终自己维护这种关系。此外,这种数据重复对我来说并不合适。有时我会看到类似的解决方案:数据记录甚至没有 UniqueImmutableName 作为其成员。例如,在他的 tutorial for D language , Andrei Alexandrescu 使用数据结构来描述剧中角色的单词统计:
struct PersonaData {
uint totalWordsSpoken;
uint[string] wordCount;
}
但是角色的名字甚至不在其中——它只是作为保存这些结构的字典的键可用。在那个上下文之外,这个数据结构几乎没有用。
我想做的是这样的:
public class UsesLambdaDict
{
LambdaDictionary<string, NamedRecord> myDict = new LambdaDictionary<string, NamedRecord>(NamedRecord _Record => _Record.UniqueImmutableName);
void AddRecord(NamedRecord _NewRecord)
{
myDict.Add(_NewRecord);
}
NamedRecord GetRecord(string _Key)
{
return myDict[_Key];
}
}
在我看来,这种处理此类数据记录的方式更好,因为 NamedRecord 的 UniqueImmutableName 成员与保存它的字典之间的关系在编译时已正式化。我看到的缺点是无法确保给定的 lambda 是纯函数,至少在 C# 中是这样。我不是很了解 D,但似乎
pure
它所拥有的关键字也不能保证。所以,我对此有几个问题:
最佳答案
1.) 我不这么认为。
2.) 使用带有键和值的结构,我认为不需要 lambda
3.) 性能问题(缓存未命中)
关于oop - 使用条目字段作为键的字典数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21041431/