在字典中存储命名结构

时间:2015-07-23 21:23:11

标签: c# dictionary struct

我有这样的结构。

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;

2 个答案:

答案 0 :(得分:2)

我认为您需要ID中的唯一DisplayNameMySctuct。如果将记录保存在具有唯一性的数据库中将是更好的选择。实际上List<MyStruct>会在这种情况下为您提供相同的功能,您不必费心改变Dictionary key

根据MSDN,你应该使用一个Class。

Choosing Between Class and Struct

√CONSIDER定义结构而不是类,如果该类型的实例很小并且通常是短暂的或通常嵌入在其他对象中。

X AVOID 定义结构,除非该类型具有以下特征的全部

  • 它逻辑上表示单个值,类似于基本类型 (int,double等)。

  • 它的实例大小不超过16个字节。

  • 这是不可改变的。

  • 不必频繁装箱。

答案 1 :(得分:0)

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是字典。