键值取决于值的键值对的集合

Kja*_*ara 5 c# dictionary key-value

我上课了 MyClass

class MyClass
{
    public string Name { get; set; } // is unique among all instances
    public SomeClass Data { get; set; }
    ...
}
Run Code Online (Sandbox Code Playgroud)

其中我想在集合中存储多个实例.我经常需要检查是否存在具有特定名称的实例,如果存在,则检索该实例.由于迭代整个集合不是一个选项(性能!),我想到了一个使用键值对的集合,例如IDictionary<string, MyClass>.

我的程序还允许重命名实例MyClass(如果违反名称唯一性,则不允许重命名).但是如果我重命名一个MyClass,我还需要从字典中删除旧条目并添加新条目(即使用新名称)以保持数据一致.

问题是我将MyClass在整个地方有几个这样的字典(其中包含所有实例的子集),并且很难跟踪它们并在每次重命名后不断更新所有字典.

有没有办法让键值对自动保持一致?我想我听说过一个允许这个的数据结构,它至少存在于C++中(遗憾的是,我不知道它是如何调用的).基本上,它应该是一个集合,其中键不仅仅是一个普通字符串,而更像是对字符串的引用(在本例中为name属性),但行为就好像它是一个字符串.C#中是否存在这样的事情?您是否有其他想法如何保持收藏一致?

我唯一的想法是在我的程序的最高级别上拥有所有词典的集合,并使重命名方法在实际重命名过程之后更新所有这些词典.但必须有更好的方法!


为什么这个问题不是改变字典键最佳方法的重复:

我已经知道字典不允许更改密钥.我反而要求另一个与键更改兼容的数据结构(不会完全失去性能优势),我也要求其他方法.因此,只要有助于解决保持数据一致性的问题,我的问题就更容易从任何方向输入.

CKI*_*KII 2

据我了解,您的问题是这样的:

  • 你有多个字典,每个字典都保存你的一部分数据
  • 您的所有实例在所有字典中都应该有唯一的名称
  • 当名称更改时:
    • 首先,检查这个名称是否仍然是唯一的
    • 用它所在的任何字典更新它

我想我会以不同的方式解决这个问题。

首先,向类中添加一个 ID 字段,该字段将是 Guid / 流水号,该字段从创建实例的那一刻起就不应更改。接下来,添加另一个仅
保存实例的名称和 ID 的字典,它应该如下所示:

[{"FirstName": "Guid1"},   
{"SecondName": "Guid2"},   
{"ThirdName": "Guid3"}]  
Run Code Online (Sandbox Code Playgroud)

其余的字典将使用 ID 作为键,而不是名称:

[{"Guid1": {instance1}},  
{"Guid2": {instance2}}] 
Run Code Online (Sandbox Code Playgroud)

现在,当您更改实例的名称时,所有名称都存在于一个字典中,该字典会告诉您它是否已存在。而且您只需要在一个地方更改它,因为字典的其余部分依赖于一个永远不会改变的常量值。
假设您想更改 的名称"FirstName",名称字典将如下所示:

[{"OtherName": "Guid1"},   
{"SecondName": "Guid2"},   
{"ThirdName": "Guid3"}] 
Run Code Online (Sandbox Code Playgroud)

其余数据不需要更改。