【发布时间】:2014-01-10 10:09:48
【问题描述】:
某些类型的数据记录经常必须由唯一键索引。通常它看起来像这样(我使用 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关键字它也不能保证。
所以,我对此有几个问题:
- 这是一个真正的问题吗?我所拥有的第一个解决方案的缺点在一定程度上是理论上的——毕竟它可能没有任何问题。
- 还有哪些其他可能的解决方法?
- 建议的解决方案还有哪些其他可能的缺点?
【问题讨论】:
-
> C# ...但这个问题并不特定于它
-
这个问题具体到哪种语言?
-
它不特定于任何语言,但由于我使用C#并提到了D,所以我决定标记它们。
标签: oop data-structures dictionary d