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

C# Discussion :

[C#] Comparer les valeurs de deux listes d'objets


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 183
    Par défaut [C#] Comparer les valeurs de deux listes d'objets
    Bonjour,

    Dans mon application, j'implémente deux listes d'objets à 30s d'écart :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    List<Object> list1 = MethodQuiRempliLaList();
    Thread.Sleep(30000);
    List<Object> list2 = MethodQuiRempliLaList();
    Les données contenues dans les objets sont de ce type :

    [0]----[1]
    User1 val1
    User2 val2
    User3 val3
    ... ...

    J'aimerais pouvoir comparer les changements de valeurs des lists en fonction de l'index [0] c'est à dire que si la list1 contient :


    [0]----[1]
    User1 val1
    User2 val2
    User3 val3
    ... ...


    Et que la list2 contient :


    [0]----[1]
    User1 val1
    User2 val40
    User3 val58
    ... ...


    Et que si je compare les deux lists, j'obtienne une troisième lists contenant :


    [0]----[1]
    User2 val40
    User3 val58


    Je pense qu'il y'a des fonctions faisant ça automatiquement mais je n'arrive pas à les adapter à mon problème .

  2. #2
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Billets dans le blog
    3
    Par défaut
    Tu peux utiliser la methode d'extension Except. Dans ton cas ca donnerait ceci pour obtenir le résultat que tu souhaites :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    var list3 = list2.Except(list1);
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2006
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 97
    Par défaut
    Bonjour,
    La fonction Except sur un IEnumerable<T> est faite pour cela.

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    class Program
        {
            static void Main(string[] args)
            {
                var list1 = new List<Toto>()
                {
                    new Toto(){Name="Toto1",Val=1},
                    new Toto(){Name="Toto2",Val=2},
                    new Toto(){Name="Toto3",Val=3},
                    new Toto(){Name="Toto4",Val=4},
                };
     
     
                var list2 = new List<Toto>()
                {
                    new Toto(){Name="Toto1",Val=1},
                    new Toto(){Name="Toto2",Val=20},
                    new Toto(){Name="Toto3",Val=30},
                    new Toto(){Name="Toto4",Val=4},
                };
     
     
                var diff = list2.Except(list1, new TotoEqualityComparer());
                foreach (var totoDiff in diff)
                {
                    Console.WriteLine("{0} -> {1}", totoDiff.Name, totoDiff.Val);
                }
     
     
            }
     
            private class TotoEqualityComparer : IEqualityComparer<Toto>
            {
     
                public bool Equals(Toto x, Toto y)
                {
                    return x.Name.Equals(y.Name) && x.Val == y.Val;
                }
     
                public int GetHashCode(Toto obj)
                {
                    return obj.Name.GetHashCode(); // libre choix du GetHashCode
                }
            }
     
            private class Toto
            {
                public String Name { get; set; }
                public int Val { get; set; }
            }
        }

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 183
    Par défaut
    Ta solution me parait séduisante Moumoune, cependant je ne connais pas le nom des champs de ma list, c'est pour ça que j'utilise une List d'object.

    Est-ce toujours compatible ?

  5. #5
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Billets dans le blog
    3
    Par défaut
    Pas la peine de se compliquer la vie, la solution tient en une seule ligne, même sur une List<object>. L'utilisation d'un EqualityComparer n'est pas nécessaire dans ce cas.
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 183
    Par défaut
    Pourtant quand j'écris ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
                    var list3 = listCur.Except(listPrec);
                    foreach (var totoDiff in list3)
                    {
                        eL.EventLoginWritter("Comparaison : " + ((object[])(totoDiff))[0] + " " + ((object[])(totoDiff))[2]);
     
                    }
    la list3 contient l'intégralité de la liste listCur alors qu'elle ne devrait contenir que les objets ayant changés je ne comprends pas

  7. #7
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Billets dans le blog
    3
    Par défaut
    Que contient ta liste précisément ? Des Array, des types anonymes ou autre ?
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/03/2013, 18h38
  2. Comparer les valeurs de deux colonnes d'une feuille excel
    Par charrynsasi dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 03/12/2012, 14h40
  3. [SQL-Server] recuperer les valeurs de deux listes sur la meme page
    Par manel ingenieur dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 23/12/2010, 11h48
  4. Comparer les valeurs de deux tableaux
    Par mailbox dans le forum Débuter
    Réponses: 12
    Dernier message: 28/11/2010, 19h14
  5. [DeskI XiR2] Comparer les valeurs de deux colonnes
    Par EmmanuelleC dans le forum Débuter
    Réponses: 2
    Dernier message: 27/02/2009, 08h45

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