这肯定是一个简单的问题,因为我太累了,我自己也没有看到答案,但我的问题是:
我有一个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 ...
如果您需要更多信息,请告诉我!
抱歉我的英文! :(
答案 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循环中。其他相同的实例将由引起此错误的成员变量引用和指向。