Souci avec une collection

[Résolu]
Signaler
Messages postés
497
Date d'inscription
mercredi 7 juillet 2004
Statut
Membre
Dernière intervention
13 juillet 2015
-
Messages postés
497
Date d'inscription
mercredi 7 juillet 2004
Statut
Membre
Dernière intervention
13 juillet 2015
-
Bonjour,



je ne comprend pas, j'ai une classe collection "col_Historique" (System.Collections.CollectionBase)
qui
contient des objets de ma classe "Historique". Jusqu'à là pas de
problème.

Dans les déclarations de ma form1, je déclare :

public col_Historique ma_col_historique = new col_Historique();


public
col_Historique ma_col_historique_recherchee = new col_Historique();

pour pouvoir travailler sur le deuxième sans toucher au contenu du premier.

Avant de travailler sur le 2ème, je copie le 1er(qui contient les objets) dans le 2ème :

ma_col_historique_recherchee = ma_col_historique;



Le pb arrive lorsque je veux supprimer une occurence de la deuxième collection
ma_col_historique_recherchee.delete_fichier(mon_fichier);

appelle ceci :

public void delete_fichier(Historique mon_fichier)

{

for (int i=0; i<this.Count;i++)

{

if (mon_fichier == this.List[i])

{

this.RemoveAt(i);

break;

}

}

}

Il me supprime aussi l'occurence dans la première collection !
Pourtant, c'est bien un THIS.RemoveAt que je fais, donc le this devrait
cibler la collection ma_col_historique_recherchee et pas les deux collections. C'est comme ci les deux collections étaient en miroir pour comparer avec deux disques durs



Une idée ?

5 réponses

Messages postés
346
Date d'inscription
lundi 8 septembre 2003
Statut
Membre
Dernière intervention
3 septembre 2007
3
Quand tu fais un objet = objet, il te copie le lien et ne duplique pas l'objet en mémoire,
il te faut peut etre redéfinir l'opérateur égale, ou alors crée une fonction duplicate ou copy dans ta classe
Messages postés
52
Date d'inscription
jeudi 28 octobre 2004
Statut
Membre
Dernière intervention
24 août 2005
1
C'est simple: les objets fonctionnent par référence: quand tu ecris ma_col_historique_recherchee
= ma_col_historique; tu ne copies pas l'objet, tu copies seulement sa
reference. donc tes 2 variables pointent vers le meme objet. Si
tu veux copier ton objet, il faut que tu fasses toi meme la fonction de
copie. Regarde du coté de l'interface ICloneable, ca peut t'aider aussi.
Miiitch
Messages postés
497
Date d'inscription
mercredi 7 juillet 2004
Statut
Membre
Dernière intervention
13 juillet 2015
6
OK, c vrai que c pas bête, j'ai regardé du côté de [ICloneable], je
pense qu'il faut le mettre juste avant la classe, mais j'ai déjà
[Serializable] j'espère que c'est cummulable.



Sinon, au moment de faire le clonage, j'ai vu qu'il y a la méthode clone, mais je sais pas trop comment l'utilser.



public col_Historique duplicate(col_Historique ma_col)

{







}


Ma fonction retourne le même type d'objet, je n'ai plus qu'à
faire le clonage, mais je ne trouve pas .clone() dans la liste de choix
sur ma_col.[???]



Miiiitch si t'as un chti exemple
Messages postés
52
Date d'inscription
jeudi 28 octobre 2004
Statut
Membre
Dernière intervention
24 août 2005
1
Il faut aussi que tes données a l'interieur de ta collection possedent
une methode pour les copier si ce sont des objets, sinon si ce sont des
structures ou des types simples , tu peux utiliser l'operateur =

Miiitch
Messages postés
497
Date d'inscription
mercredi 7 juillet 2004
Statut
Membre
Dernière intervention
13 juillet 2015
6
Bon, en fait, je n'ai pas réussi à faire fonctionner l'interface
ICloneable, il me dit qu'il manque une directive using, alors que cela
n'a besoin que de system, bref.



je copie tous les objets de col1 à col2 comme ceci :



public col_Historique duplicate()

{

col_Historique nouvelle_col = new col_Historique();

foreach (Historique mon_fichier in this)

{

nouvelle_col.Add(mon_fichier);

}

return
nouvelle_col;

}



Merci de m'avoir mis sur la voie