复制 C# 列表中的条目
本文关键字:列表 复制 | 更新日期: 2023-09-27 18:37:05
我对C#有点陌生,我遇到了一个奇怪的问题。正在发生的事情是,我添加到列表中的所有值都重复了,我不知道为什么,因为每次我将对象添加到列表中时,我都会在下一行重新初始化该对象...这是我的代码:
waves=new List<EnemyWave>();
EnemyWave cur_wave=null;
for (int i=1; i<lines.Length; i++){
string[] point_b=lines[i].Split("'t"[0]);
if (point_b[0].StartsWith("[WAVE ")){
string wave_data=point_b[0].Replace("[WAVE ","");
int data=System.Convert.ToInt32(wave_data.Remove(wave_data.Length-1));
if (cur_wave==null){
cur_wave=new EnemyWave(data);
path.addPoint(System.Convert.ToInt32(point_a[0]),System.Convert.ToInt32(point_a[1]));
} else {
waves.Add(cur_wave);
cur_wave=new EnemyWave(data);
}
} else {
if (cur_wave==null){
createPath(point_a,point_b,i);
point_a=point_b;
} else {
string type=point_b[0].ToLower();
int wait_time=0;
if (point_b.Length>1 && !point_b[1].Equals("")){
wait_time=System.Convert.ToInt32(point_b[1]);
}
cur_wave.addEnemyData(type,wait_time);
}
}
}
waves.Add(cur_wave);
所以,这里重要的是waves
和cur_wave
,正如你所看到的,在我cur_wave
添加到waves
之后,我重新初始化它。那么,还有什么在制作重复项呢?因为我在waves.Add(cur_wave); cur_wave=new EnemyWave(data);
行之前和之后以及第一次调试时放置了调试代码,所以我得到的位置项0
正确,但在第二个调试代码上,位置0
项已被清除......
编辑
我忘了说我正在使用Unity 4.2.2f1。这是我的调试代码:
[...]
if (point_b[0].StartsWith("[WAVE ")){
string wave_data=point_b[0].Replace("[WAVE ","");
int data=System.Convert.ToInt32(wave_data.Remove(wave_data.Length-1));
if (cur_wave==null){
cur_wave=new EnemyWave(data);
path.addPoint(System.Convert.ToInt32(point_a[0]),System.Convert.ToInt32(point_a[1]));
} else {
if (waves.Count>0){
foreach (EnemyData en_data in waves[0].getArrayEnemyData()){
Debug.Log (en_data.getType());
}
}
if(!waves.Contains(cur_wave))
waves.Add(cur_wave);
cur_wave=new EnemyWave(data);
if (waves.Count>0){
foreach (EnemyData en_data in waves[0].getArrayEnemyData()){
Debug.Log (en_data.getType());
}
}
}
} else {
[...]
以下是文件的内容。
-320 240
-220 40
220 60
320 -240
[WAVE 1000]
Weak
Weak 500
Weak 500
Weak 1000
[WAVE 1000]
Weak
Weak 500
Weak 500
[WAVE 1000]
Medium
Medium 500
两个调试都应打印以下内容:
weak
weak
weak
weak
但是我weak
得更少,我只在第一次调试时得到它......第二个没有打印任何东西...怎么了?
您正在遍历元素列表(文件的行?),执行一些修改并将相应的变量添加到列表中,而无需任何预检查。如果给定的元素是重复的(例如,两行相同的行),它们无论如何都会被添加到列表中。此外,您正在循环外执行最后一次添加,这可能会引发进一步的重复。最安全的做法是在添加之前始终检查。将waves.Add(cur_wave);
替换为:
if(!waves.Contains(cur_wave)) waves.Add(cur_wave);
好的,错误不在于这段代码...那是和EnemyWave
在一起,所以,我真的找错了地方......问题是这样的:
public static List<EnemyData> enemies_data;
因为错误地做了这个static
,我在想,不知何故,传递给List
的对象是重复的......但是不,我只是在每次制作new
时替换这个变量,而不知情......因此,解决方案只是将这段代码更改为:
private List<EnemyData> enemies_data;
该死的,我以前从未遇到过这样的问题...