在字典中存储命名结构
本文关键字:结构 存储 字典 | 更新日期: 2023-09-27 18:04:16
我有一个这样的结构。
public struct MyStruct
{
public string name;
// other variables and stuff
public MyStruct(string name)
{
this.name = name;
}
}
我在字典中存储了很多,可能有数百甚至数千个,并将它们的name
作为关键字。
var myStructs = new Dictionary<string, MyStruct>();
myStructs.Add("Foo", new MyStruct("Foo"));
我并不总是能够访问字典的键(例如检索值时(,因此必须在其中定义结构的名称。
我的问题是,结构体的名称可能与字典中的键不同。存在这样的条件是一个实际的问题吗?
myStructs.Add("Bar", new MyStruct("Baz"));
这有点偏离了这个问题的主题,但与上面的问题有点相关,但如果键Foo
下的结构的名称发生了更改,我将如何将键更新为新名称?
var temp = myStructs["Foo"];
temp.name = "Bar";
myStructs["Foo"] = temp;
我认为您需要一个唯一的ID
和MySctuct
中的DisplayName
。如果将记录保存在具有唯一性的数据库中,则会是一个更好的选择。实际上,在这种情况下,List<MyStruct>
将为您提供相同的功能,您不必为更改Dictionary
key
而烦恼。
根据MSDN,您应该在您的案例中使用一个类。
在类和结构之间进行选择
√考虑如果类型的实例很小并且通常是短暂的,或者通常嵌入在其他对象中,则定义结构而不是类。
X AVOID定义一个结构,除非该类型具有所有以下特征:
-
它在逻辑上表示单个值,类似于基元类型(int、double等(。
-
它的实例大小小于16字节。
-
它是不可变的。
- 它不必经常装箱
var temp = myStructs["Foo"];
myStructs.Remove(temp.name);
temp.name = "Bar";
myStructs.Add(temp.name, temp);
或者,您可以将MyStruct.name
设置为属性,并在name
更改时自动更新:
struct MyStruct
{
private string _name;
public string name
{
get { return _name; }
set
{
if (_name == value) return;
GlobalStorageClass.myStructs.Remove(_name);
_name = value;
GlobalStorageClass.myStructs.Add(_name, this);
}
}
public MyStruct(string name)
{
_name = name;
GlobalStorageClass.myStructs.Add(name, this);
}
}
其中GlobalStorageClass.myStructs
是字典。