2013-10-27 4 views
0

Я немного новичок в C#, и у меня странная проблема. Что происходит в том, что все значения, которые я добавляю в список, дублируются, и я не знаю, почему, потому что каждый раз, когда я добавляю объект в список, я повторно инициализую этот объект в следующей строке ... Вот мой код :Дублирование записей на 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 были расчищены ...

EDIT

Я забыл сказать, что я использую 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 меньше, и я только получить его на первом отлаживать ... Второй один ничего не печатает ... Что не так?

ответ

0

Ok, ошибка не была с этим кодом ... Он был с EnemyWave и так, я действительно искал на ненужном месте ... Вот проблема:

public static List<EnemyData> enemies_data; 

Из-за этого static по ошибке я думал, что каким-то образом объект, переданный на List, был дублирован ... Но нет, я просто заменял эту переменную каждый раз, когда я делал new, не зная об этом ... Таким образом, решение было просто изменить этот код на это:

private List<EnemyData> enemies_data; 

Черт, я никогда не имел проблем подобного раньше ...

1

Вы повторяете список элементов (строк файла?), Выполняя некоторые изменения и добавляя соответствующие переменные в список без предварительной проверки. Если данные элементы дублируются (например, две идентичные строки), они будут добавлены в список в любом случае. Кроме того, вы выполняете последнее дополнение вне цикла, что может спровоцировать дальнейшее дублирование. Самая безопасная вещь всегда проверяется перед добавлением. Заменить waves.Add(cur_wave); с:

if(!waves.Contains(cur_wave)) waves.Add(cur_wave); 
+0

я не могу проверить это прямо сейчас, но я думаю, что проблема не в последней строке, потому что, как я уже сказал, у меня есть поместите 2 кода отладки (распечатайте содержимое переменной, которая находится внутри 'waves [0]'), после и перед добавлением следующей итерации, и вначале она дала мне содержимое, но, во-вторых, оно ничего мне не давало (как «волны [0]», были заменены на «новые EnemyWave (данные);»). Кроме того, я уже проверил, что у меня нет дублированных строк (но да, они из файла =)). –

+0

@cristianosantos модификация, которую я предложил, гарантирует, что повторение не произойдет ни на что; это рекомендуется для ваших условий.В любом случае, как сказано, ваш код вообще не учитывает повторения: входы берутся из файла, если у него разные одинаковые записи, появятся дубликаты – varocarbas

+0

@varocarabs Это не сработало ... Я отредактирую мой вопрос и поместить код, который я использовал для отладки. Может быть, это помогает. –

Смежные вопросы