Max*_*kov 6 oop dictionary d data-structures
某种类型的数据记录经常必须由唯一密钥索引.通常它看起来像这样(我使用的是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];
}
}
Run Code Online (Sandbox Code Playgroud)
然而,这似乎有点多余:该词典中的键应始终被认为是等于NamedRecord.UniqueImmutableName,但开发人员自己维持这种关系.而且,这种数据重复对我来说感觉不对.
有时我看到一个类似的解决方案:数据记录甚至没有UniqueImmutableName作为其成员.例如,在他的D语言教程中,Andrei Alexandrescu使用数据结构来描述游戏中角色的单词统计:
struct PersonaData {
uint totalWordsSpoken;
uint[string] wordCount;
}
Run Code Online (Sandbox Code Playgroud)
但是角色的名字甚至不在其中 - 它只能作为字典的关键字来保存这些结构.在这种情境之外,这种数据结构几乎是无用的.
我想做的是这样的:
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];
}
}
Run Code Online (Sandbox Code Playgroud)
在我看来,这种处理此类数据记录的方式更好,因为NamedRecord的UniqueImmutableName成员与其保存的字典之间的关系在编译时正式化.我看到的缺点是,没有办法确保给定的lambda将是一个纯函数,至少在C#中是这样.我真的不太了解D,但似乎pure它所拥有的关键字无法保证.
所以,我有几个问题: