将元素添加到字典中的列表<class>会修改已存储的所有变量

时间:2017-05-03 13:25:42

标签: c# list dictionary

我想我必须遗漏一些C#如何工作的基本知识。 我在结构中有一个列表,用作字典的值。 但是,每当我向字典添加新对象时,已经存储在字典中的所有变量都会发生变化。 我显然创建了具有相同引用的对象,只是认为我不是:P,因此我不确定如何解决它。 以下是相关代码:

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            DizClass diz = new DizClass();

            Group tempG = new Group();

            tempG.Category = 1;
            tempG.Chiave = "A";

            diz.Add(tempG);

            tempG.Category = 2;
            tempG.Chiave = "B";

            diz.Add(tempG);

            tempG.Category = 3;
            tempG.Chiave = "A";

            diz.Add(tempG);

            diz.Print();
        }
    }
}

namespace WindowsFormsApp1
{
    class Group
    {
        public string Chiave { get; set; }
        public int Category { get; set; }
    }

    struct Host_Struct
    {
        public string variableStr;
        public List<Group> lista;
    }

    class DizClass
    {
        Dictionary<string, Host_Struct> diz = new Dictionary<string, Host_Struct>();

        public void Add(Group gr)
        {
            if (diz.ContainsKey(gr.Chiave))
            {
                diz[gr.Chiave].lista.Add(gr);
            }
            else
            {
                Host_Struct tempHS = new Host_Struct(){ lista = new List<Group>() { gr } };
                diz.Add(gr.Chiave, tempHS);
            }
        }

        public void Print() {
            foreach (string Key in diz.Keys) foreach (Group val in diz[Key].lista) Debug.Print("{0} - {1}", Key, val.Category);
        }
    }
}

我希望获得:

  • A - 1
  • A - 3
  • B - 2

我得到了:

  • A - 3
  • A - 3
  • B - 3

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

您使用面向对象。

您只创建一个对象并将该对象添加3次。

Group tempG = new Group();

...

diz.Add(tempG);

试试这个:

Group tempG1 = new Group();

tempG1.Category = 1;
tempG1.Chiave = "A";

diz.Add(tempG1);

Group tempG2 = new Group();

tempG2.Category = 2;
tempG2.Chiave = "B";

diz.Add(tempG2);

...

diz.Print();

我建议你阅读有关面向对象编程的内容。

答案 1 :(得分:1)

该列表仅存储对“Group”-Object的引用。您添加相同的“组”3次并在两者之间进行更改。

修正:

        Group tempG = new Group();
        tempG.Category = 1;
        tempG.Chiave = "A";

        diz.Add(tempG);

        tempG = new Group();
        tempG.Category = 2;
        tempG.Chiave = "B";

        diz.Add(tempG);

        tempG = new Group();
        tempG.Category = 3;
        tempG.Chiave = "A";

        diz.Add(tempG);