Structure dans arraylist

Résolu
cs_adaemon Messages postés 8 Date d'inscription mardi 20 mars 2007 Statut Membre Dernière intervention 7 juin 2007 - 31 mars 2007 à 18:39
cs_adaemon Messages postés 8 Date d'inscription mardi 20 mars 2007 Statut Membre Dernière intervention 7 juin 2007 - 1 avril 2007 à 12:25
Bonjour,

je souhaiterais mettre des structures dans une arraylist, et pouvoir accéder aux éléments de la structure stockée à l'index i de mon arraylist. Le foreach me permet d'accéder à toutes les structures de l'arraylist, mais il me faudrait pouvoir accéder à une structure bien localisée.

Bout de code :

void test()
{
Arraylist test1 = new Arraylist();
test1.add(new mystruct());
//comment accéder aux élements de la structure en test1[0] ?
}

struct mystruct
{
}

Merci.

13 réponses

cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
31 mars 2007 à 20:15
Oui, car l'arrayList est une liste d'object.
Tu peux faire des listes typées à l'aide des Generics :

List<MyClass> lists = new List<MyClass>();

Et ensuite:
MyClass m = lists[myIndex];

Avec .NET, ArrayList n'a plus trop d'utilité...

<hr />
-Blog-
3
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
31 mars 2007 à 18:56
Salut,

En castant :
mystruct test = (mystruct)test1[0];

/*
coq
MVP Visual C#
CoqBlog
*/
0
cs_adaemon Messages postés 8 Date d'inscription mardi 20 mars 2007 Statut Membre Dernière intervention 7 juin 2007
31 mars 2007 à 20:05
merci, j'ai testé et effectivement ça fonctionne. Mais j'ai envie de dire : ouch
c'est lourd comme utilisation. Si j'ai bien compris, si tu veux modifier un champ de ta structure qui est dans l'arraylist, il faut la caster dans une structure externe à l'arraylist et ensuite recopier la structure externe dans la structure de l'arraylist ?
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
31 mars 2007 à 20:23
ArrayList est une classe destinée à être une collection de n'importe quoi, et à ce titre elle est typée Object, type commun à tous les types en .NET, qu'ils soient référence ou valeur.
Si tu veux une collection spécialisée, tu peux développer une classe de collection fortement typée, ou utiliser une des classes de collection Generics.

/*
coq
MVP Visual C#
CoqBlog
*/
0

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

Posez votre question
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
31 mars 2007 à 20:27
Moi et ma manie de mettre des liens partout...

/*
coq
MVP Visual C#
CoqBlog
*/
0
cs_adaemon Messages postés 8 Date d'inscription mardi 20 mars 2007 Statut Membre Dernière intervention 7 juin 2007
31 mars 2007 à 20:36
ok je vais regarder ça.

Je mettrai réponse acceptée quand j'aurai fait marcher le truc ^^

Merci :)
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
31 mars 2007 à 21:01
"Si j'ai bien compris, si tu veux modifier un champ de ta structure qui est dans l'arraylist, il faut la caster dans une structure externe à l'arraylist et ensuite recopier la structure externe dans la structure de l'arraylist ?"



Oui ça c'est à cause de la copie par valeur.. avec une classe, il faudra toujours passer par un cast mais il sera inutile ensuite de recopier cette classe dans l'ArrayList.
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
31 mars 2007 à 21:38
Je suis en forme, je n'avais même pas saisi le sens réel de la phrase :-/
Merci d'avoir compléter Lutinore

/*
coq
MVP Visual C#
CoqBlog
*/
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
31 mars 2007 à 22:28
On pourrait aussi parler du boxing/unboxing  ce qui montre vraiment que Structure + ArrayList c'est pas une bonne solution.
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
31 mars 2007 à 22:45
Yep, c'est bien visible dans la page de Object citée plus haut :-)

/*
coq
MVP Visual C#
CoqBlog
*/
0
cs_adaemon Messages postés 8 Date d'inscription mardi 20 mars 2007 Statut Membre Dernière intervention 7 juin 2007
1 avril 2007 à 01:25
yo
effectivement ca marche bien les generics. Par contre j'ai dû utilisé une classe à la place d'une struct, ça me faisait une erreur à la compilation avec la struct. J'avais le code suivant :




List



<myStruct> test = newList<myStruct>();
test.Add(new myStruct());
test[0].myString="hello world";







avec

struct myStruct
{
string myString;
}

J'ai une erreur au niveau du test[0].... ça me dit



Impossible de modifier la valeur de retour de 'System.Collections.Generic.List<my_project.myStruct>.this[int]', car il ne s'agit pas d'une variable

voilà vous savez ptet pourquoi. Bonne soirée.
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
1 avril 2007 à 02:54
Oui on vient juste d'en parler dans les messages précédent, c'est à cause de la copie par valeur.  avec test[ 0 ] tu n'accèdes pas à ta structure mais à une copie de celle-ci. Et comme là tu ne la sauvegarde pas dans une variable intermédiaire le compilo considère que c'est pas une lvalue valide.

Le code suivant ne déclenche aucun avertissements du compilo mais le problème est le même, c-à-d que la variable contenue dans la liste n'a pas été modifiée.

List< MyStruct > list = new List< MyStruct >( );
list.Add( new MyStruct( ) );
MyStruct copie = list[ 0 ];
copie.MyString = "Hello";
0
cs_adaemon Messages postés 8 Date d'inscription mardi 20 mars 2007 Statut Membre Dernière intervention 7 juin 2007
1 avril 2007 à 12:25
ok  
je crois que je vais travailler avec les classes. Du coup, je ne vois plus trop l'intérêt des structures.
En tout cas, merci à tous et bon dimanche. Je viendrai surement embeter les forumeurs de csharp plus tard ^^.

bye
0
Rejoignez-nous