OVH Cloud OVH Cloud

Question existancielle sur tout ce qui implémente IList...

7 réponses
Avatar
MrChris
Salut !

Comment faire de manière propre pour modifier un élément d'un arraylist
en parcourant par un for each ???

Imaginons une classe Personne (et deux instances Personne1 et Personne2):
Public Class Personne
Public Nom as string
Public Prenom as String
End Class

Puis une collection de personnes
Dim PersonneS as new arraylist
PersonneS.add(Personne1)
PersonneS.add(Personne2)

Comment faire pour modifier une personne dans Personnes ???

Je procède de la manière suivante :

Dim PersAModifier as Personne
For each TmpPers as Personne in Personnes
If TmpPers = PersonneQueJeCherche then
PersAModifier = TmpPers
End If
Next
Personnes.remove(PersAModifier)
PersAModifier.Nom = MaModif
Personnes.add(PersAModifier)

C'est une usine à gaz, je pense qu'il y a plus simple !!!
Une solution ?

Merci
MrChris

7 réponses

Avatar
MrChris
Correction :

Personnes.remove(PersAModifier)
PersAModifier = MaNouvellePersonne
Personnes.add(PersAModifier)

Hop !
Avatar
Olivier
Pourquoi pas utiliser une collection ?
Moi je fais :

' ================== Public Class Personne
Public ID As Integer
Public Nom As String
End Class

Public Class Personnes
Inherits System.Collections.CollectionBase

Public Sub Add(ByVal UnePersonne As Personne)
MyBase.List.Add(UnePersonne)
End Sub

Public ReadOnly Property Item(ByVal Index As Integer) As Personne
Get
Return CType(MyBase.List.Item(Index), Personne)
End Get
End Property
End Class
'==================
Ensuite, je fais :

Dim UnePersonne As New Personnes

AllPersonnes.Item(0).Nom = "GATES Bill"

en tout cas, vivement VS2005 avec les Generics...

A plus
Olivier


"MrChris" a écrit dans le message de
news:
Salut !

Comment faire de manière propre pour modifier un élément d'un arraylist
en parcourant par un for each ???

Imaginons une classe Personne (et deux instances Personne1 et Personne2):
Public Class Personne
Public Nom as string
Public Prenom as String
End Class

Puis une collection de personnes
Dim PersonneS as new arraylist
PersonneS.add(Personne1)
PersonneS.add(Personne2)

Comment faire pour modifier une personne dans Personnes ???

Je procède de la manière suivante :

Dim PersAModifier as Personne
For each TmpPers as Personne in Personnes
If TmpPers = PersonneQueJeCherche then
PersAModifier = TmpPers
End If
Next
Personnes.remove(PersAModifier)
PersAModifier.Nom = MaModif
Personnes.add(PersAModifier)

C'est une usine à gaz, je pense qu'il y a plus simple !!!
Une solution ?

Merci
MrChris




Avatar
Zazar
Bonjour;

Comment faire de manière propre pour modifier un élément d'un arraylist
en parcourant par un for each ???

Imaginons une classe Personne (et deux instances Personne1 et Personne2):
Public Class Personne
Public Nom as string
Public Prenom as String
End Class

Puis une collection de personnes
Dim PersonneS as new arraylist
PersonneS.add(Personne1)
PersonneS.add(Personne2)

Comment faire pour modifier une personne dans Personnes ???

Je procède de la manière suivante :

Dim PersAModifier as Personne
For each TmpPers as Personne in Personnes
If TmpPers = PersonneQueJeCherche then
PersAModifier = TmpPers
End If
Next
Personnes.remove(PersAModifier)
PersAModifier.Nom = MaModif
Personnes.add(PersAModifier)

C'est une usine à gaz, je pense qu'il y a plus simple !!!
Une solution ?



Oui, il suffit de faire :
PersonneQueJeCherche.Nom = MaModif

Les variables que vous utilisez sont des réfèrences vers vos objets (à
condition que ceux-ci soient des classes et non des structures ou des types
primitifs). Si vous avez 2 variables qui sont deux réfèrences vers le même
objet, alors toute modification par une des 2 variables sera répercutée sur
l'autre. Un IList n'étant qu'une liste de réfèrence, le comportement est le
même.
Suis-je clair ?

--
Zazar
Avatar
Ambassadeur Kosh
dériver de collectionBase, c'est le plus cool.
prend ce bout de code xml par exemple

<?xml version="1.0"?>
<namespace name="Test">
<collection type="Pinguin"/>
</namespace>

utilise le template xsl dessus. ça va te generer une classe fortement typée
qui va répondre à ton probleme.
le foreach(Dog dog in myPinguinCollection) te jettera des la compilation.

voila voila


<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method = "text" />


<xsl:template match="/">using System ;
using System.Collections ;
using System.ComponentModel ;

<xsl:apply-templates select="*"/>
</xsl:template>


<xsl:template match="/namespace">namespace <xsl:value-of select="@name"/>
{<xsl:apply-templates select="*"/>
}
</xsl:template>

<xsl:template match="collection">
[Serializable()]
public class <xsl:value-of select="@type"/>Collection : CollectionBase
{
public <xsl:value-of select="@type"/>Collection()
{

}

public <xsl:value-of select="@type"/> this[int index]
{
get { return ((<xsl:value-of select="@type"/>)(List[index])); }
set { List[index] = value; }
}

public int Add(<xsl:value-of select="@type"/> value)
{
return List.Add(value);
}

public bool Contains(<xsl:value-of select="@type"/> value)
{
return List.Contains(value);
}

public void CopyTo(<xsl:value-of select="@type"/>[] array, int index)
{
List.CopyTo(array, index);
}

public int IndexOf(<xsl:value-of select="@type"/> value)
{
return List.IndexOf(value);
}

public void Insert(int index, <xsl:value-of select="@type"/> value)
{
List.Insert(index, value);
}

public new <xsl:value-of select="@type"/>Enumerator GetEnumerator()
{
return new <xsl:value-of select="@type"/>Enumerator(this);
}

public void Remove(<xsl:value-of select="@type"/> value)
{
List.Remove(value);
}

public class <xsl:value-of select="@type"/>Enumerator : object,
IEnumerator
{
private IEnumerator baseEnumerator;
private IEnumerable temp;

public <xsl:value-of select="@type"/>Enumerator(<xsl:value-of
select="@type"/>Collection mappings)
{
this.temp = ((IEnumerable)(mappings));
this.baseEnumerator = temp.GetEnumerator();
}

public <xsl:value-of select="@type"/> Current
{
get { return ((<xsl:value-of
select="@type"/>)(baseEnumerator.Current)); }
}

object IEnumerator.Current
{
get { return baseEnumerator.Current; }
}

public bool MoveNext()
{
return baseEnumerator.MoveNext();
}

bool IEnumerator.MoveNext()
{
return baseEnumerator.MoveNext();
}

public void Reset()
{
baseEnumerator.Reset();
}

void IEnumerator.Reset()
{
baseEnumerator.Reset();
}
}
}
</xsl:template>

</xsl:stylesheet>
Avatar
Ambassadeur Kosh
désolé, je me suis trompé de thread :)
A+ tous
Avatar
MrChris
Merci, c'est ce que je fait !!!!
Sauf que personne est une structure !!!
Comme le dit Zazar, mon problème viendrais de la !

Merci beaucoup !!!
@+MrChris
Avatar
MrChris
> Les variables que vous utilisez sont des réfèrences vers vos objets (à
condition que ceux-ci soient des classes et non des structures ou des


types
primitifs).



Hé, hé !
Tu es trop fort !!! dans mon exemple, j'ai utilisé la classe personne,
(habitude)
alors que dans mon prog c'est une structure !!!
Bravo (c'etait pour voir si vous suivez :*)) ) !

Bon, c'est cool ! c'est vraiment le genre d'erreur que j'aurais eu du mal à
trouver tout seul.

Merci beaucoup !!!
MrChris