c# - 键值依赖于值的键值对集合

标签 c# dictionary key-value

我有一个类MyClass

class MyClass
{
    public string Name { get; set; } // is unique among all instances
    public SomeClass Data { get; set; }
    ...
}

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

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

问题是我到处都有几个这样的字典(其中包含所有 MyClass 实例的子集),并且很难跟踪它们并在每次重命名后持续更新所有字典。

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

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


为什么这个问题不是 Best way to change dictionary key 的重复问题:

我已经知道字典不允许更改键值。相反,我要求另一种数据结构以某种方式与关键更改兼容(不会完全失去性能优势),并且我也要求其他方法。所以我的问题对任何方向的输入都更加开放,只要它有助于解决保持数据一致的问题。

最佳答案

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

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

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

首先,向类中添加一个 ID 字段,该字段将是一个 Guid/running number,该字段从创建实例的那一刻起就永远不会改变。
接下来,添加另一个字典,包含实例的名称和 ID,它应该如下所示:

[{"FirstName": "Guid1"},   
{"SecondName": "Guid2"},   
{"ThirdName": "Guid3"}]  

您的其他字典将把 ID 作为键,而不是名称:

[{"Guid1": {instance1}},  
{"Guid2": {instance2}}] 

现在,当您更改实例的名称时,所有名称都存在于一个字典中,该字典会告诉您它是否已经存在。而且你只需要在一个地方改变它,因为其余的字典依赖于一个永远不会改变的常量值。
所以说你想改变 "FirstName" 的名字,名字字典看起来像这样:

[{"OtherName": "Guid1"},   
{"SecondName": "Guid2"},   
{"ThirdName": "Guid3"}] 

其余的数据不需要改变。

关于c# - 键值依赖于值的键值对集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46558907/

相关文章:

javascript - 您能解释一下下面两个 JavaScript 代码片段之间的区别吗?

c# - 按另一个列表更新列表 (linq)

c# - 将 BYTE 数组转换为 INT

python - 可以在 python 中使用类作为字典键吗?

javascript - 将 Javascript 数组组合成键值查找

c++ - const 和非 const 键有什么区别?

c# - 样式表未正确加载或链接

c# - MS 企业库配置应用程序 block 已从 4.1 堆栈中删除?

python - 模板中的 Django 字典 : Grab key from another objects attribute

python - 使用嵌套 for 循环的推导式创建字典