IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

[Generic List] Petit problème de compréhension


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2010
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2010
    Messages : 52
    Par défaut [Generic List] Petit problème de compréhension
    Bonjour à tous!

    Donc jeune fou que je suis, j'essaie de comprendre en détail le fonctionnement du Generic List dans un objectif a prime abord assez simple.

    J'ai MyObject:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Public Class MyObject
        Public Name as String
        Public Value as Integer
     
    End Class
    Et dans mon form principal, une list de MyObject
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    [...]
    dim lst as New List(of MyObject)
    [...]

    Donc de base, je comprend qu'avec la Generic List, on peut écrire ceci:
    Qui me donnera le "value" du premier "MyObject" contenu dans la liste. Qui est très équivalent à:

    Donc j'imagine que quelque part, on a décidé que List(T) serait équivalent a List.Items(T) ?

    Mon questionnement, et objectif, est de savoir s'il est possible d'obtenir quelque chose comme:
    Et donc de fournir la propriété "Name" de "MyObject" au lieu de fournir la position qu'il tient dans la liste.... ?


    J'ai chercher avec des possibilités telles que Overrides la fonction "Equals"... mais finalement ça a pas trop rapport avec le besoin. Et au final, les changements seraient a appliquer directement sur la List(of T). Je me demande s'il y a peut-être moyen de créer une "super liste" qui pourrait avoir le comportement cité plus haut?

    J'espère comme toujours avoir été assez clair


    Amuny,

  2. #2
    Membre expérimenté Avatar de Saintelaitlait
    Homme Profil pro
    Responsable ServiceDesk
    Inscrit en
    Août 2011
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Canada

    Informations professionnelles :
    Activité : Responsable ServiceDesk
    Secteur : Service public

    Informations forums :
    Inscription : Août 2011
    Messages : 179
    Par défaut
    Salut,

    Avoir directement accès comme tu le décrit ca se fait pas si automatiquement.

    Un moyen qui reste assez simple en soi est d'utiliser Linq.


    Ajoute une référence à System.Linq et essaie un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
            Dim lst As New List(Of MyObject)
            Dim result = From obj In lst _
                         Where obj.Name = "Nom"
     
            Dim MyObject2 As MyObject
            MyObject2 = result(0)

    Dans cet exemple MyObject2 contiendra l'objet que tu recherchais. Si tu veux seulement accéder à ces propriété tu va pouvoir faire (J'Ai mis ca dans un msgbox)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     MsgBox(result(0).Name)

    Bonne chance

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2010
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2010
    Messages : 52
    Par défaut
    Rendu a faire du LINQ pour sélectionné mon objet, autant me faire une méthode getByName() dedans, ce serai encore plus simple et clair a mes yeux. Surtout que c'est quelque chose dont je vais me servir très, très souvent.

    Ce que je me demande c'est justement s'il y a moyen de faire plus "propre" dans le code. Dans le contexte, mon but est de faire un DLL le plus simple a utilisé possible, donc je vise surtout a généré des fonctions "propres" dans l'utilisation du programme. Et pourquoi faire simple quand on peut faire compliqué?

    Je trouverais ça très dommage que pour accéder a mon List(of MyObject), l'utilisateur de mon petit DLL soit obligé de taper du LINQ!

    Et puis d'un point de vue connaissance / curiosité, je cherche quand même a comprendre pourquoi je peux faire List(id) simplement au lieu de faire List.Items(id), il doit y avoir une logique... et si il y a une logique pour ça, c'est qu'il y a forcément un moyen de faire ce que je recherche... sauf que je ne sais pas par où commencer mes recherches

  4. #4
    Membre expérimenté Avatar de Saintelaitlait
    Homme Profil pro
    Responsable ServiceDesk
    Inscrit en
    Août 2011
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Canada

    Informations professionnelles :
    Activité : Responsable ServiceDesk
    Secteur : Service public

    Informations forums :
    Inscription : Août 2011
    Messages : 179
    Par défaut
    Si ton dll imports sytem.Linq, et que tu fait une fonction getByName qui recoit le name de l'objet, qui le recherche en Linq et return cet objet, je comprend pas le problème est ou?

    Ton utilisateur de DLL va faire

    unObjet = taDll.getByName(Clown)

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2010
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2010
    Messages : 52
    Par défaut
    Il n'y a pas de "problème" a proprement parler sur cette partie là, et ce serait parfaitement fonctionnel!
    (après au lieu d'utiliser du LINQ un simple for dans la liste aurait fait pareil... a savoir lequel est le plus performant... je suis curieux sur la question!)

    Mais ce qui pique encore plus ma curiosité, c'est cette possibilité d'appeler un item de la Liste directement avec lst(0), et c'est cette curiosité qui me pousse a chercher s'il est possible d'étendre cette force vers quelque chose d'encore plus dynamique

  6. #6
    Membre émérite
    Avatar de neilbgr
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2004
    Messages
    651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 651
    Par défaut
    Citation Envoyé par Amuny Voir le message
    Mon questionnement, et objectif, est de savoir s'il est possible d'obtenir quelque chose comme:
    Et donc de fournir la propriété "Name" de "MyObject" au lieu de fournir la position qu'il tient dans la liste.... ?
    En dotnet, il existe aussi Dictionary(Of TKey, TValue) et KeyedCollection(Of TKey, TItem) qui peuvent atteindre ton objectif.

    Afin de m'éviter un copier/coller, je t'invite aller voir que la msdn.

  7. #7
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2010
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2010
    Messages : 52
    Par défaut
    Citation Envoyé par neilbgr Voir le message
    En dotnet, il existe aussi Dictionary(Of TKey, TValue) et KeyedCollection(Of TKey, TItem) qui peuvent atteindre ton objectif.

    Afin de m'éviter un copier/coller, je t'invite aller voir que la msdn.
    Alors ça!
    Ça concorde exactement avec ce que je cherchais, même si sa ne répond pas a ma curiosité du "comment il ramasse sa valeur directement!?", c'est quand même exactement le besoin que j'avais.

    Du coup, si ca intéresse quelqu'un pour l'implémentation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Imports System.Collections.ObjectModel
     
    Public Class MyObject
        Public Name As String
        Public Value As Integer
     
    End Class
     
    Public Class MyObjList
        Inherits KeyedCollection(Of String, MyObject)
     
     
        Protected Overrides Function GetKeyForItem(item As MyObject) As String
            Return item.Name
        End Function
     
    End Class
    Puis:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Dim lst As New MyObjList()
    lst.Add(new MyObject("nom", 12))
    Messagebox.Show(lst("nom").Value)

    Merci encore!

    Amuny,

  8. #8
    Membre émérite
    Avatar de neilbgr
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2004
    Messages
    651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 651
    Par défaut
    Citation Envoyé par Amuny Voir le message
    [...] même si sa ne répond pas a ma curiosité du "comment il ramasse sa valeur directement!?"
    à lire : La notion de propriété par défaut

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 37
    Par défaut
    Juste pour dire:c'est possible avec une Méthodes d'extension et de la réflexion.
    Mais c'est bien mieux d'utiliser une KeyedCollection.
    Fait quand même attention a ce que tu a besoin de faire avec les Dictionary(Of TKey, TValue) j'ai eu la surprise de découvrir que la sérialisation n'est pas implémente par défaut.

  10. #10
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 194
    Par défaut
    Si c'est une List<T> tu peux simplement faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myObj = myList.SingleOrDefault(obj => obj.Name == "Nom");
    Ca va selectionner le premier objet qui correspond au critère de recherche (et renvoyer null si aucun objet de la liste ne correspond à la recherche)
    connait pas bien la syntaxe en VB.Net

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 11/10/2012, 12h53
  2. Petit problème de compréhension
    Par alen dans le forum SL & STL
    Réponses: 0
    Dernier message: 29/05/2008, 22h14
  3. Petit problème de compréhension d'une ligne de code
    Par totoc1001 dans le forum Images
    Réponses: 3
    Dernier message: 12/03/2007, 21h44
  4. Petit problème de liste déroulante (encore un)
    Par kabal dans le forum Struts 1
    Réponses: 7
    Dernier message: 10/12/2006, 15h08
  5. Petit problèmes avec display list et transformations
    Par Baptiste Wicht dans le forum OpenGL
    Réponses: 5
    Dernier message: 10/02/2006, 17h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo