Bonjour,
Est-il possible de créer une collection qui soit un sous-ensemble d'une autre collection sans passer par une boucle?
Version imprimable
Bonjour,
Est-il possible de créer une collection qui soit un sous-ensemble d'une autre collection sans passer par une boucle?
Bonsoir Alain,
LINQ permet de faire cela (relativement) facilement et travail directement avec les propriétés des objets contenu dans la collection.
C'est vraiment fascinent à découvrir.
Merci beaucoup.
J'ai commencé à explorer mais je tombe sur un problème.
Dans cet exemple (très simplifié, pas de clause Where) de code
pas de problème pour obtenir SubCollection mais visiblement SubCollection n'est pas du même type que UneCollectionDobjets.Code:
1
2
3 Dim UneCollectionDobjets As Collection Dim SubCollection = From Col In m_colCollections Select Col UneCollectionDobjets = SubCollection
Comment assigner SubCollection (le résultat du Linq) à UneCollectionDobjet?
si m_colCollections et UneCollectionDobjets on le même type de base
exemple List<obj> et array<obj> la tu peux utiliser juste la fonction Tolist
sinon tu peux sélectionner le résultat et la formate comme tu veux avec exempleCode:
1
2 UneCollectionDobjets = SubCollection.ToList()
Code:
1
2 Dim x = From it in SomeCollection Select New Student With { .Name = it.Name }
Bonjour,
J'espérais que tous mes types étaient clairs.
UneCollectionDobjets est, comme son nom l'indique ainsi que sa déclaration, une Collection destinée à recevoir un sous-ensemble de la Collection m_colCollections.
m_colCollections (je sais que le nom peut paraître ambigu mais pas pour moi...) est une Collection d'objets issus d'une Classe (clsCollection).
SubCollection est le résultat renvoyé par Linq et semble ne pas être une Collection mais une List.
Donc ta phrase
me fait croire que tu n'as pas compris mon problème puisque, justement, je constate que le type n'est pas le même.Citation:
si m_colCollections et UneCollectionDobjets ont le même type de base
Peut-être que je dois changer mes "As Collection" en "As List(Of clsCollection)"...???
Collection serait-il un reliquat de Visual Basic(6) laissé dans VB DOT.NET pour compatibilité?
Je ne connais pas VB, je suppose que Collection est du .NET 1.x., donc non générique. Collection<T> est la version générique (depuis .NET 2.0). Linq renvoie du générique, qui ne peut être assigné à une version non générique.
Tout ça pour dire que tu devrais effectivement essayer avec As List(Of clsCollection) Mais alors ajoute un "ToList" à la fin (ou alors crée ta variable comme un IEnumerable<T>), car Select retourne un IEnumerable<T>
Ce doit être genre :
Code:
1
2 Dim UneCollectionDobjets As IEnumerable(Of T)
Ou T est le type d'objet qui se trouve dans la collection m_colCollections.
Exemple
Code:
1
2 Dim UneCollectionDobjets As IEnumerable(Of string)
Grand merci.
J'ai déjà testé le List(Of T) (je viens de comprendre ce que veut dire le T) et ça m'a l'air de mieux se comporter que les Collections.
Pour la suite, je n'ai pas le temps d'approfondir dans l'immédiat. Je m'en suis sorti avec une boucle en attendant mieux.
Dès que j'en ai fini avec l'application en cours, promis je m'y plonge.
Et cela rejoint ce que je t'explique dans ta discussion : Remplacer modules standards par modules de classe
On déclare une variable de type IEnumerable(Of T) dans laquelle on peut mettre n'importe quelle objet qui implémenterait cette interface, donc une bonne partie des collections générique comme List(Of T) :
Code:
1
2
3
4
5
6 'Declaration <SerializableAttribute> _ Public Class List(Of T) _ Implements IList(Of T), ICollection(Of T), _ IList, ICollection, IReadOnlyList(Of T), IReadOnlyCollection(Of T), _ IEnumerable(Of T), IEnumerable