Souci avec une collection

Résolu
el_teedee Messages postés 497 Date d'inscription mercredi 7 juillet 2004 Statut Membre Dernière intervention 13 juillet 2015 - 11 juil. 2005 à 09:34
el_teedee Messages postés 497 Date d'inscription mercredi 7 juillet 2004 Statut Membre Dernière intervention 13 juillet 2015 - 11 juil. 2005 à 10:36
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

taoetc Messages postés 346 Date d'inscription lundi 8 septembre 2003 Statut Membre Dernière intervention 3 septembre 2007 3
11 juil. 2005 à 09:44
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
3
Miiitch Messages postés 52 Date d'inscription jeudi 28 octobre 2004 Statut Membre Dernière intervention 24 août 2005 1
11 juil. 2005 à 09:44
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
3
el_teedee Messages postés 497 Date d'inscription mercredi 7 juillet 2004 Statut Membre Dernière intervention 13 juillet 2015 9
11 juil. 2005 à 10:21
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
0
Miiitch Messages postés 52 Date d'inscription jeudi 28 octobre 2004 Statut Membre Dernière intervention 24 août 2005 1
11 juil. 2005 à 10:30
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
el_teedee Messages postés 497 Date d'inscription mercredi 7 juillet 2004 Statut Membre Dernière intervention 13 juillet 2015 9
11 juil. 2005 à 10:36
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
0
Rejoignez-nous