在字典中存储命名结构

本文关键字:结构 存储 字典 | 更新日期: 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;

在字典中存储命名结构

我认为您需要一个唯一的IDMySctuct中的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是字典。