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 :

[LINQ] Vérifier si deux listes ont des éléments en commun.


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut [LINQ] Vérifier si deux listes ont des éléments en commun.
    Hello,

    Je pose le problème. Disons que nous avons la classe suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Public Class MyClass
        Public Property Id As Integer
        Public Property List As List(Of Integer)
     
        'peu importe le reste de la classe
    End Class
    Si on a une liste de type List(Of MyClass), comment s'assurer que, pour chaque instance de MyClass dans notre liste, leur liste de type List(Of Integer) n'ont pas d'élément en commun.

    Je pensais faire cela en Linq mais j'ai du mal...
    Mon idée étant d'ajouter un propriété à MyClass pour marquer les instances à problèmes. Une fois les instances de MyClass qui posent problèmes repérées, je peux les colorer/mettre en erreur/etc. facilement dans le DataGridView qui les affiche pour l'utilisateur.

    Voici où j'en suis :
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Dim myList As List(Of MyClass)
    'remplissage de la liste, peu importe comment
     
    'selection des instances qui posent problèmes
    Dim data = (From i As MyClass In myList
                     Join j as MyClass In myList on Not i.Id Equals j.Id
                     'il manque quelque chose ici pour faire la comparaison des deux listes d'entiers...
                     Select i)
     
    'marquage de ces instances
    For Each elem as MyClass In data.ToList
        elem.IsError = True
    Next

    Quelqu'un aurait-il une idée ? Peut-être aussi que je fais fausse route avec Linq. Si vous avez un autre moyen plus efficace, je suis preneur bien sûr.

    Merci d'avance.

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    Par défaut
    j'aurais tenté un truc du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dim r = (from m1 in mylist from m2 in mylist where m1 isnot m2 and m1.ids.intersect(m2.ids).count > 0 select new with {.instance1 = m1, .instance2 = m2})
    mais pas sur que ca soit bon ^^
    enfin au moins tu as le .intersect (sort une liste avec que ce qui est identique) et le .count>0 qui dit s'il y en a
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    Ah je ne connaissais pas le intersect !

    Vais tester cela de suite

    EDIT
    J'avais tenté de simplier/généraliser l'exemple. Ca marche aussi si à la place d'une liste d'entier j'ai une liste d'une autre classe custom ? J'imagine qu'il va falloir que cette 2e classe custom implémente une interface du genre IComparable non ?

    EDIT 2
    Il faut effectivement implémenter IEqualityComparer(Of T) si j'ai bien compris la MSDN.
    Je passe la discussion en résolu. Il n'y a pas de raison que cela ne fonctionne pas .

  4. #4
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    Par défaut
    pour un type par valeur, ca doit être = qui est utilisé (integer et autre)
    pour un type par référence, ca doit être Is qui est utilisé (classe, pointeur identique)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    pour un type par valeur, ca doit être = qui est utilisé (integer et autre)
    pour un type par référence, ca doit être Is qui est utilisé (classe, pointeur identique)
    Oui, ça c'est le comparateur par défaut. Mais dans mon cas, ce n'est pas bon car vu qu'il s'agit d'une classe custom, c'est évidemment un type par référence mais en plus, ce sont à chaque fois des instances différentes chez moi car chaque objet va récupérer "lui-même" sa liste d'objet dans la DB. Du coup, on se retrouve avec des listes qui pourrait contenir des objets identiques mais dans des instances bien séparées. Le Is n'est alors pas utilisable si j'ai bien tout compris car l'opérateur Is regarde si les deux objets sont bien stockées au même endroit en mémoire. Si oui, ils sont identiques.

    Du coup, ma classe doit implémenter IEqualityComparer(Of T) histoire que .NET sache comment déterminer si deux objets du type T sont identiques.

    Ca va ? Je n'écris pas trop de conneries ? ^^

  6. #6
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    Par défaut
    ca doit être ca oui
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

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

Discussions similaires

  1. [XL-2007] Comment créer une dépendance entre deux listes avec des données issus d'un tableau?
    Par efesdark dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 04/07/2011, 16h22
  2. Réponses: 20
    Dernier message: 27/07/2010, 15h52
  3. Concatenation des éléments de deux listes
    Par bellak dans le forum Linq
    Réponses: 7
    Dernier message: 02/06/2010, 14h32
  4. Permutez des éléments entre deux zones deux listes
    Par dricks dans le forum VBA Access
    Réponses: 2
    Dernier message: 14/09/2007, 09h56
  5. Réponses: 2
    Dernier message: 27/10/2006, 18h22

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