在List中添加对象

本文关键字:对象 添加 List | 更新日期: 2023-09-27 18:03:21

当我从一个名为cmbMaxim的组合框中选择一个项目时,我想在List <T>中添加对象。问题是我获得了一个具有相同对象(最后添加的对象)的列表。这似乎是新的操作符不会工作,我获得对同一对象的引用。下面是代码:

public partial class Form1 : Form
{
    List<Varianta> lvar = new List<Varianta>();
    int contor = 0;
    public Form1()
    {
        InitializeComponent();
    }

    private void cmbMaxim_SelectedIndexChanged(object sender, EventArgs e)
    {
        int[] vgen = new int[6];
        int vmax = Convert.ToInt32(cmbMaxim.Text);
        for (int i0 = 1; i0 < vmax - 4; i0++)
            for (int i1 = i0 + 1; i1 < vmax - 3; i1++)
                for (int i2 = i1 + 1; i2 < vmax - 2; i2++)
                    for (int i3 = i2 + 1; i3 < vmax - 1; i3++)
                        for (int i4 = i3 + 1; i4 < vmax; i4++)
                            for (int i5 = i4 + 1; i5 < vmax + 1; i5++)
                            {
                                Varianta var = new Varianta();
                                vgen[0] = i0;
                                vgen[1] = i1;
                                vgen[2] = i2;
                                vgen[3] = i3;
                                vgen[4] = i4;
                                vgen[5] = i5;
                                contor++;
                                var.Var = vgen;
                                var.Index = contor;
                                lvar.Add(var);
                            }
    }
}

Varianta类:

class Varianta
{
    int[] var = new int[6];
    int index;
    int scor=0;
    int eliminate=0;
    public int Scor
    {
        get 
        { 
            return scor;
        }
        set 
        { 
            scor = value; 
        }
    }
    public int Index
    {
        get 
        { 
            return index; 
        }
        set 
        { 
            index = value; 
        }
    }

    public int [] Var
    {
        get 
        { 
            return var; 
        }
        set 
        { 
            var = value; 
        }
    }
}

怎么了?

在List中添加对象

由于您在循环之外创建了int[] vgen,因此每次执行lvar.Add(var)(其中var.Var = vgen)时,您都指向相同的变量(int[] vgen)。

但与此同时,在每个循环中,你都在改变int[] vgen的值(覆盖之前的值)。

代码一点也不好。正如其他人指出的那样,6个嵌套循环将是调试的噩梦。但话虽如此,我想一个简单的解决方案是在循环中声明int[] vgen ,它将为您工作。

Edit:正如@crashmstr指出的,另一种使其工作的方法是使用var.Var[0] = i0等(而不是使用vgen[0] = i0)。不需要在循环中重新声明int[] vgen,因为它已经在Varianta中初始化了。

您需要先清除列表。当前事件一个接一个地添加条目。

    private void cmbMaxim_SelectedIndexChanged(object sender, EventArgs e)
    {
        lvar.Clear();
        int[] vgen = new int[6];
        ...