列表即使已保存也会重置

时间:2016-01-14 21:05:12

标签: c# arraylist

我现在的工作是制作食谱书。食谱类具有名称和成分列表(Zutaten)作为属性。当我第一次创建配方并将其保存在配方列表中时,它具有正确的数据。 1)为什么当我进入下面的第二个代码部分来创建第二个配方时,第一个配方成分列表(Zutaten)被清空了? (我没有做任何改变食谱数据的事情) 2)为什么当我在配方列表中保存第二个配方时,第一个配方具有相同的第二个配方的成分列表?

  public Rezept(String name, List<Zutaten> ingredient)
            {
                this.name = name;
                this.ingredient = ingredient;
            }

这是我的班级Rezept中的一个。

 public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        Verwaltung ve = new Verwaltung();
        private List<Rezept> rezept = new List<Rezept>();   
        List<Zutaten> z = new List<Zutaten>();

        String na;
        Zutaten zutat;
        int m;

             private void buttonAdd_Click(object sender, EventArgs e)
             {

            z.Clear();

                na = tBName.Text;
                m = Convert.ToInt32(tBMenge.Text);
                switch (comboBoxUnit.SelectedItem.ToString())
                {
                    case ("Gramm"):
                        zutat = new Zutaten(na, m, Einheit.Gramm);
                        break;
                    case "Litre":
                        zutat = new Zutaten(na, m, Einheit.Litre);
                        break;
                    case "Stueck":
                        zutat = new Zutaten(na, m, Einheit.Stueck);
                        break;
                }
                z.Add(zutat);

                ListViewItem item = new ListViewItem();
                item.Text = na;
                item.SubItems.Add(m.ToString());
                switch (zutat.getEinheit)
                {
                    case Einheit.Gramm:
                        item.SubItems.Add("Gramm");
                        break;
                    case Einheit.Litre:
                        item.SubItems.Add("Litre");
                        break;
                    case Einheit.Stueck:
                        item.SubItems.Add("Stueck");
                        break;
                }

                lVZutaten.Items.Add(item);

}

这就是我每次创建一个新的Zutaten列表的方法。并创建一个新的Rezept,我用这个方法

Rezept r = new Rezept(textBoxName.Text, z);
                rezept.Add(r);

z是我在第二段代码中创建的Zutaten列表。

2 个答案:

答案 0 :(得分:1)

因为您在两个实例中都使用相同的列表。

您有一个列表。每个配方中都会保存对该列表的引用。每次单击“添加”时,它都会清除列表并添加新项目。

根据您的评论,您有2个按钮,一个用于添加成分,另一个用于完成配方。你永远不应该清理(删除)成分列表。您应该在创建配方时创建新列表。

private List<Rezept> recipes = new List<Rezept>();
private List<Zutaten> ingredients = new List<Zutaten>();

private void AddIngredient()
{
    var i = new Zutaten();
    ingredients.Add(i);
}

private void AddRecipe()
{
    var r = new Rezept("My Recipe", ingredients);
    ingredients = new List<Zutaten>();
    recipes.Add(r);
}

答案 1 :(得分:0)

您使Rezept的所有实例与z共享相同的引用。所以一旦你改变z,每个实例的成分也会改变。

在Rezept的构造函数中,尝试使用:

this.ingredient = ingredient.Clone();

而不是

this.ingredient = ingredient;

这可能会解决您的问题。