J'ai un peu de code sur lequel j'ai travaillé pour un ami ces derniers jours. À un niveau élevé, il analyse un fichier texte et écrit dans une MDB. Pour résumer une histoire courte, j'ai un couple de boucles imbriquées en train de traiter les objets. La boucle interne n'est appelée que dans certains cas, mais lorsqu'elle le fait, elle fait des choses étranges.Valeurs de collection Changement dans la boucle
ArrayList CaseRecordItems = new ArrayList(); // this is created earlier
string baseTif = "sometext_"; // this is created earlier
CaseRecord cr = new CaseRecord(); (this gets populated with "stuff")
char increment = 'A';
for (int i = 0; i < FirstNames.Count; i++)
{
cr.Firstname = (string)FirstNames[i];
cr.Lastname = (string)LastNames[i];
if (FirstNames.Count > 1)
{
cr.Tif = baseTif + increment.ToString();
increment++;
}
CaseRecordItems.Add(cr);
}
La boucle exécute par exemple deux fois et devrait définir la valeur de cr.Tif à sometext_A et sometext_B. Cela fonctionne correctement, mais une fois que le deuxième élément est ajouté à la collection, la valeur de la première est modifiée pour le faire correspondre.
Je suppose que cela est dû à un manque de compréhension de la façon dont ces objets sont instanciés et transmis. Toute idée serait appréciée.
EDIT:
D'après les commentaires impressionnant (et mon engourdie-nutzery) le problème a été résolu. Grâce à la réponse de Dan, j'ai apporté quelques modifications au code que j'avais essayé avant d'utiliser la fonction clone (oui, la plage que j'avais essayé: P). Le nouveau bloc ressemble à ceci: ArrayList CaseRecordItems = new ArrayList(); // ceci est créé plus tôt string baseTif = "sometext_"; // ceci est créé plus tôt CaseRecord cr = new CaseRecord(); // ceci est rempli avec "stuff") char increment = 'A';
for (int i = 0; i < FirstNames.Count; i++)
{
CaseRecord cr2 = new CaseRecord();
cr2 = cr.Clone(); // preserves the data from outside
cr2.Firstname = (string)FirstNames[i];
cr2.Lastname = (string)LastNames[i];
if (FirstNames.Count > 1)
{
cr2.Tif = baseTif + increment.ToString();
increment++;
}
CaseRecordItems.Add(cr2);
}
Merci à tous pour les réponses super rapides!
Pouvons-nous obtenir le code plus complet? Où cr est-il créé? –
cr est un poco créé dans le bloc directement avant la boucle – kdmurray
Il n'y a pas non plus de boucle foreach. –