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

标签 oop data-structures dictionary d

某种类型的数据记录经常必须由唯一键索引。通常它看起来像这样(我使用 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/

    相关文章:

    用于字符串匹配的Java数据结构

    python - “property”对象不可迭代,尝试在调用正在使用的 API 后获取响应

    python - Python 中的多处理 : how to implement a loop over "apply_async" as "map_async" using a callback function

    javascript - 在 Javascript 中, "this.something"是否查找 "something"的作用域链?

    javascript - this.method.bind(this) 方法是做什么的?

    java - 流中的第一个非重复字符

    从文件创建链表并重置头部

    C# 字典访问

    javascript - 如何使用事件监听器的构造函数方法

    oop - Love2D(Lua)中的面向对象编程