2013-06-01 4 views
1

J'ai une liste de type Personne. Lorsque je crée la liste des personnes, elle remplace les informations de l'élément de la liste précédente par l'actuelle. J'ai lu à propos de ceci étant le problème avec les variables de classe statique, mais aucun de mes attributs sont statiques. Je lis dans les gens d'un fichier et le stocke dans un tableau de chaînes. Je suis intervenu pour m'assurer que le tableau est correct. C'est.liste remplaçant tous les éléments précédents

est ici où il obtient bizarre:

string[] personArray; 
Person tempPerson = new Person(); 
List<Person> people = new List<Person>(); 
foreach (string line in lines)//lines are the people from file, it is correct 
{ 
personArray = line.Split(','); 
if (personArray.Length == 2) 
{ 
tempPerson.Name = personArray[0]; 
tempPerson.Address = personArray[1]; 
people.Add(tempPerson); 
} 
} 

I étape dans le code et la première personne est ajouté correctement, la deuxième personne est ajouté regarder dans les gens et ils ont tous deux l'information de la deuxième personne. Tout semble juste après l'instruction d'ajout.

Répondre

5

Vous devez déplacer l'initialisation de

Person tempPerson = new Person(); 

dans la boucle

 string[] personArray; 

     List<Person> people = new List<Person>(); 
     foreach (string line in lines)//lines are the people from file, it is correct 
     { 
      personArray = line.Split(','); 
      if (personArray.Length == 2) 
      { 
      Person tempPerson = new Person(); 
      tempPerson.Name = personArray[0]; 
      tempPerson.Address = personArray[1]; 
      people.Add(tempPerson); 
      } 
     } 

Sinon, vous modifiez les propriétés du même objet.

+0

Merci beaucoup. Je pensais que ce n'était pas un problème dans l'addition? Je fais cela en C++ et ça marche bien? – Lainezor

+1

@Lainezor: Et c'est pourquoi il est important de connaître le langage que vous utilisez réellement, plutôt que de supposer que toutes les langues gèrent les choses de la même manière :) Il est vraiment important de comprendre les différences entre les références et les objets. Voir http://pobox.com/~skeet/csharp/references.html –

+3

@Lainezor - En C++ si vous avez un 'vecteur ' alors 'people.push_back (tempPerson)' va copier l'objet 'tempPerson' dans le vecteur . En C#, 'people.Add (tempPerson)' ajoute une ** référence ** à 'tempPerson' à la liste. Cela signifie que votre liste contient plusieurs copies de la même référence à un seul objet 'Person'. Vous êtes en train de muter cet objet via votre référence 'tempPerson', donc le changement apparaît dans tous les éléments de la liste. – Lee

Questions connexes