fregolo52
Messages postés1115Date d'inscriptionmercredi 15 juin 2011StatutMembreDernière intervention 6 mai 2021
-
3 avril 2006 à 15:08
fregolo52
Messages postés1115Date d'inscriptionmercredi 15 juin 2011StatutMembreDernière intervention 6 mai 2021
-
3 avril 2006 à 22:22
Bonjour,
Je cherche un moyen de stocker mes éléments et de les retrouver facilement.
J'ai une classe principale (nommé Camera) et des classes dérivées (CameraAnalog, CameraNum ...). Au départ, je suis parti en faisant des collections pour chaque type. Mais quand je veux retrouver un élément d'après son ID, je suis obligé de scruter toutes les collections.
Après, je me suis dit que j'allais instancier les CameraAnalog et CameraNum et que j'allais sauvegarder le 'pointeur' dans une collection de Camera. En C++, je vois comment faire, mais en C# ? En gros faire un tableau de pointeur, mais je crois que ce n'est pas recommandé en C#.
Je ne prends surement pas la bonne méthode. Pouvez-vous me guider pour éviter que je dérive trop ?
Toutes mes données sont en mémoire volatile et je voudrais éviter la sérialisation.
sebseb42
Messages postés495Date d'inscriptiondimanche 6 juillet 2003StatutMembreDernière intervention 9 novembre 20071 3 avril 2006 à 15:26
ou se trouvent tes instance ? dans la mémoire non managée ? et sous quelle forme ? quel est le language que tu utilise ? qu'elle est l'architecture de ton programme (code natif mixé avec tu code managé ?) ?
si tes instance sont en mémoire non managé, tu peux essayer ceci : Marshal.PtrToStructure
sinon si tu es completement en mémoire managé, selon moi le meilleure serait de faire une liste de Camera, soit en utilisant un ArrayList, soit en utilisant List<Camera>, mais dans les deux cas, tu peux filtrer facilement et proprement de la sorte :
foreach (Camera generic_cam in MyListOfCamera)
{
CrocoCamera specific_cam = generic_cam as CrocoCamera;
if (specific_cam == null)
continue;
// traitement;
}
ainsi tu filtres pour n'exploiter que les CrocoCamera
J'espere avoir pu t'aider
fregolo52
Messages postés1115Date d'inscriptionmercredi 15 juin 2011StatutMembreDernière intervention 6 mai 20213 3 avril 2006 à 16:18
Merci pour ces infos.
Pour tes questions, je développe en C# pur.
Si j'ai bien compris dans mon ArrayList je stocke à la volée les CrocoCamera, les CameraIP et après pour savoir ce que j'ai dedans je fais un cast et s'il me rend null c'est que c'est pas le bon type d'instance.
Pfff, dur dur le passage du C au C# (sans trop connaitre C++) :-)
en C# tu ferais ca :
CrocoCamera specific_cam = (CrocoCamera)generic_cam;
fregolo52
Messages postés1115Date d'inscriptionmercredi 15 juin 2011StatutMembreDernière intervention 6 mai 20213 3 avril 2006 à 16:53
Merci beaucoup, je vais explorer les 2 solutions qui me paraisse identiques.
Si j'ai bien compris la hashTable et une ArrayList optimisée pour la recherche d'éléments.
sebseb42
Messages postés495Date d'inscriptiondimanche 6 juillet 2003StatutMembreDernière intervention 9 novembre 20071 3 avril 2006 à 20:13
oui (pour ton post plus haut) l'operateur as et l'operateur de cast n'ont pas le meme fonctionnement, le cast leve une exception si le type n'est pas bon, il faut par conséquent mettre un bloc try/catch, ce qui est lourd... as renvoie tout simplement null dans ta variable si le type ne match pas, et la bonne instance si ca match, ce qui est tout de meme plus élégant :)
sebseb42
Messages postés495Date d'inscriptiondimanche 6 juillet 2003StatutMembreDernière intervention 9 novembre 20071 3 avril 2006 à 20:15
la solution de la table de hash dans laquelle tu stock les ID de tes camera ne solutionnera pas le type de camera que tu as stocker, et il te faudra tout de meme faire un cast.
fregolo52
Messages postés1115Date d'inscriptionmercredi 15 juin 2011StatutMembreDernière intervention 6 mai 20213 3 avril 2006 à 22:22
Merci, vu que ce n'est pas un programme très volumineux en données (50 items grand max) l'arraylist sera assez performante.
PS: je développe avec VS2003, je viensde tester mon programme avec VC# Express, sacré différence de pref niveau graphique. (plus de temps mort dans les owner draw :-))