Structure dans arraylist

[Résolu]
Signaler
Messages postés
8
Date d'inscription
mardi 20 mars 2007
Statut
Membre
Dernière intervention
7 juin 2007
-
Messages postés
8
Date d'inscription
mardi 20 mars 2007
Statut
Membre
Dernière intervention
7 juin 2007
-
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

Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
56
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-
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
93
Salut,

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

/*
coq
MVP Visual C#
CoqBlog
*/
Messages postés
8
Date d'inscription
mardi 20 mars 2007
Statut
Membre
Dernière intervention
7 juin 2007

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 ?
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
93
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
*/
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
93
Moi et ma manie de mettre des liens partout...

/*
coq
MVP Visual C#
CoqBlog
*/
Messages postés
8
Date d'inscription
mardi 20 mars 2007
Statut
Membre
Dernière intervention
7 juin 2007

ok je vais regarder ça.

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

Merci :)
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
39
"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.
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
93
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
*/
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
39
On pourrait aussi parler du boxing/unboxing  ce qui montre vraiment que Structure + ArrayList c'est pas une bonne solution.
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
93
Yep, c'est bien visible dans la page de Object citée plus haut :-)

/*
coq
MVP Visual C#
CoqBlog
*/
Messages postés
8
Date d'inscription
mardi 20 mars 2007
Statut
Membre
Dernière intervention
7 juin 2007

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.
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
39
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";
Messages postés
8
Date d'inscription
mardi 20 mars 2007
Statut
Membre
Dernière intervention
7 juin 2007

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