List <t> .Add()更改List

时间:2017-07-10 09:47:43

标签: c# list

这肯定是一个简单的问题,因为我太累了,我自己也没有看到答案,但我的问题是:

我有一个for循环,其中有一个List<T>.Add(),因此在循环的每个回合中,它会向列表中添加一些东西。但是我检查了一下,我发现在每个回合中,添加添加了正确的元素,但是将列表中的每个其他元素更改为新元素!你知道这会导致什么吗?这是我的代码:

private static List<Niveau> computeNiveaux(int[,] tri) {
    List<Lot> lotsNiveau = new List<Lot>();
    List<Niveau> niveaux = new List<Niveau>();
    Lot lot;
    bool isNiveau = false; 

    for (int row = 0; row < tri.GetLength(0); row++)
    {
        for (int column = 0; column < tri.GetLength(1); column++)
        {
            if (tri[row, column] == 1) { 
                lot = lots.ElementAt(column);
                lotsNiveau.Add(lot);
                isNiveau = true;
            }
        }
        if (isNiveau)
        {
            Niveau niv = new Niveau(lotsNiveau.First().niveau, lotsNiveau.First().etage, lotsNiveau);
            niveaux.Add(niv);

        lotsNiveau.Clear();
        isNiveau = false;
    }
    return niveaux;
}
  • lots是一个类变量(不知道英文中的正确名称是什么^^&#39;)List<Lot>

  • Niveau是:

    public class Niveau {
        public int numero;
        public string etage;
        public List<Lot> lots;
    
        public Niveau(int numero, string etage, List<Lot> lots) {
            this.numero = numero;
            this.etage = etage;
            this.lots = lots;
        }
    }
    
  • 当我想看到每个niveaux.ElementAt(i).lots.Count(对于i = 0,...,niveaux.Count)时,我得到了什么:16 16 16 ...即使我知道循环的第一个转弯是7,然后是4,然后是10,等等,最后一个转弯是16.(那不是很清楚,我希望你理解x&#39;)

  • 在循环的下一步,如果添加的值例如为23,则niveaux将变为:23 23 23 23 ...

  • 如果您需要更多信息,请告诉我!

  • 抱歉我的英文! :(

4 个答案:

答案 0 :(得分:2)

因为您一直使用该批次的相同实例,所以应用于此实例的任何更改(通过赋值lots.ElementAt(column))也会影响以前添加的所有元素。所以尝试使用如下:

if (tri[row, column] == 1) 
{ 
    Lot lot = lots.ElementAt(column); // change is here
    lotsNiveau.Add(lot);
    isNiveau = true;
}

答案 1 :(得分:1)

您反复使用相同的列表lotsNiveau。 变化:

Niveau niv = new Niveau(lotsNiveau.First().niveau, lotsNiveau.First().etage, lotsNiveau.ToList());//Create new list instance

答案 2 :(得分:1)

每次在if条件内都需要创建新实例。但是目前您只是将先前定义的相同实例添加到列表中,而不是创建新实例并添加到列表中。

所以修改你的if条件,如下面

private static List<Niveau> computeNiveaux(int[,] tri) {
    List<Lot> lotsNiveau = new List<Lot>();
    List<Niveau> niveaux = new List<Niveau>();

    bool isNiveau = false; 

    for (int row = 0; row < tri.GetLength(0); row++)
    {
        for (int column = 0; column < tri.GetLength(1); column++)
        {
            if (tri[row, column] == 1) { 
                Lot lot = lots.ElementAt(column);
                lotsNiveau.Add(lot);
                isNiveau = true;
            }
        }
        if (isNiveau)
        {
            Niveau niv = new Niveau(lotsNiveau.First().niveau, lotsNiveau.First().etage, lotsNiveau);
            niveaux.Add(niv);

        lotsNiveau.Clear();
        isNiveau = false;
    }
    return niveaux;
}

答案 3 :(得分:1)

移动列表&lt;很多&GT; lotsNiveau =新列表&lt;很多&GT;();在for循环中。其他相同的实例将由引起此错误的成员变量引用和指向。