使用条目字段作为键的字典数据结构

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它所拥有的关键字无法保证.

所以,我有几个问题:

  1. 这是一个真正的问题吗?我所拥有的第一个解决方案的缺点在某种程度上是理论上的 - 毕竟可能没有任何问题.
  2. 有什么其他可能的解决方法?
  3. 建议的解决方案还有哪些其他可能的缺点?

Koz*_*i11 1

1.) 我不这么认为。

2.) 使用带有键和值的结构,我认为 lambda 不是必需的

3.) 性能问题(缓存未命中)