Combiner 2 List<T> [Résolu]

Messages postés
34
Date d'inscription
mercredi 26 octobre 2005
Statut
Membre
Dernière intervention
24 septembre 2014
- - Dernière réponse : elguevel
Messages postés
735
Date d'inscription
jeudi 19 décembre 2002
Statut
Membre
Dernière intervention
22 novembre 2016
- 17 juil. 2013 à 22:04
Bonjour,

Je conçois en se moment un petit système de mise à jour pour une application, mais il se trouve que j'ai un petit soucie pour combiner 2 List<T> qui ont la même structure :

public class ListFiles
{
    public string Name { get; set; }
    public Version Version { get; set; }   
}


Et je voudrais les combiner en une seul List<T> d'un autre type de structure :

public class ListUpdateFiles
{
    public string Name { get; set; }
    public Version Version { get; set; }
    public Version UpdateVersion { get; set;  }
}


J'ai déjà trouver deux méthodes pour combiner ces deux List

La première

List<ListUpdateFiles> ListUpdate = (from LocalFile in ListLocalFiles
             join UpdateFile in ListUpdateFiles on LocalFile.Name equals UpdateFile.Name
             select new ListUpdateFiles
             {
                 Name = LocalFile.Name,
                 Version = LocalFile.Version,
                 UpdateVersion = UpdateFile.Version
             }).ToList();


La deuxième

List<ListUpdateFiles> results ListLocalFiles.Zip(ListUpdateFiles, (LocalFile, UpdateFile)>
                new ListUpdateFiles{ Name LocalFile.Name, Version LocalFile.Version, UpdateVersion = UpdateFile.Version }).ToList();


Mon problème étant que si un fichier est en plus dans une des deux List, elle n'apparait pas dans le résultat de la combinaison.
Je sais que je suis pas loin de la solution, mais je ne parviens pas a trouver comment tourner la requête linq, pourrez vous m'aidez, merci.
Afficher la suite 

8 réponses

Meilleure réponse
Messages postés
13978
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 novembre 2019
319
3
Merci
Bonjour,

cette page montre des exemples de requettes Linq.

            List<ListFiles> LocalFile = new List<ListFiles>();
            LocalFile.Add(new ListFiles{ Name"1", Version new Version("1.1.1.1")});
            LocalFile.Add(new ListFiles{ Name"2", Version new Version("1.1.1.1")});
            LocalFile.Add(new ListFiles{ Name"3", Version new Version("1.1.1.1")});
            LocalFile.Add(new ListFiles{ Name"4", Version new Version("1.1.1.1")});

            List<ListFiles> UpdateFile = new List<ListFiles>();
            UpdateFile.Add(new ListFiles { Name "1", Version new Version("2.1.1.1") });
            UpdateFile.Add(new ListFiles { Name "2", Version new Version("2.1.1.1") });
            UpdateFile.Add(new ListFiles { Name "3", Version new Version("2.1.1.1") });
            UpdateFile.Add(new ListFiles { Name "5", Version new Version("2.1.1.1") });


            var concatGroup LocalFile.Concat(UpdateFile).GroupBy(f> f.Name);//je concatene les deux liste et les group en fonciton du nom

            List<ListUpdateFiles> ListUpdate = (from fi in concatGroup
                                                let vu (fi.Count() 2 ? fi.ElementAtOrDefault(1).Version : new Version())//si il y a deux enregistrements dans le group, la version est transférée, sinon version par défaut
                                                select new ListUpdateFiles
                                                {
                                                    Name = fi.Key,//la clé du group est le nom
                                                    Version = fi.ElementAt(0).Version,//la version est celle du premier enregistrement du groupe
                                                    UpdateVersion = vu//resulstat du test plus haut
                                                }).ToList<ListUpdateFiles>();


Whismeril

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 212 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Whismeril
Messages postés
13978
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 novembre 2019
319
3
Merci
Oui, le fait de grouper ne laisse pas de trace (de ce que j'en sais) de l'enregistrement d'origine, alors que la concaténation laisse les deux listes dans leur ordre d'origine.

Ceci permet de choisir
            var concatGroup LocalFile.Select(fi> new {fi.Name,fi.Version, Origine = "Local" }).Concat(UpdateFile.Select(fi => new {fi.Name,fi.Version, Origine = "Update" })).GroupBy(f => f.Name);//je concatène les deux listes et les groupe en fonction du nom, ajout de la notion d'origine

            List<ListUpdateFiles> ListUpdate = (from fi in concatGroup
                                                let vu (fi.Count() 2 ? fi.ElementAt(1).Version : fi.ElementAt(0).Origine == "Update" ? fi.ElementAt(0).Version : new Version())//si il y a deux enregistrements dans le groupe, la version est transférée, sinon version la version n'est transférée qui si elle vient de update
                                                let v (fi.Count() 2 ? fi.ElementAt(0).Version : fi.ElementAt(0).Origine == "Local" ? fi.ElementAt(0).Version : new Version())//si il y a deux enregistrements dans le groupe, la version est transférée, sinon version la version n'est transférée qui si elle vient de local
                                                select new ListUpdateFiles
                                                {
                                                    Name = fi.Key,//la clé du group est le nom
                                                    Version = v,//résultat du test plus haut
                                                    UpdateVersion = vu//résultat du test plus haut
                                                }).ToList<ListUpdateFiles>();



Whismeril

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 212 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Whismeril
Messages postés
34
Date d'inscription
mercredi 26 octobre 2005
Statut
Membre
Dernière intervention
24 septembre 2014
0
Merci
Juste une seul chose à dire ..... MAGNIFIQUE

Déjà merci pour le lien sur les exemples de requête, sa va surement m'aider. Et merci de m'avoir sortie un code aussi bien expliquer.
Commenter la réponse de cs_Yanith
Messages postés
13978
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 novembre 2019
319
0
Merci
De rien, il y a peut être mieux mais je suis encore loin de maitriser Linq.
Tu peux remplacer fi.ElementAtOrDefault(1) par fi.ElementAt(1), vu que je n'ai pas défini la valeur par défaut.

Whismeril
Commenter la réponse de Whismeril
Messages postés
34
Date d'inscription
mercredi 26 octobre 2005
Statut
Membre
Dernière intervention
24 septembre 2014
0
Merci
fallait bien que je trouve un problème

Si je reprend ton code, dans la List UpdateFile se trouve un fichier nommé 5, quand j'exécute ton code il me transfert sa version dans la colonne Version de la List ListUpdateFiles, or il faudrait qu'il soit dans la colonne UpdateVersion.

Je sais pas si j'ais bien nommé la structure de ListUpdateFiles, sa serais peu être plus compréhensible si je le faisait comme ça

public class ListUpdateFiles
{
    public string Name { get; set; }
    public Version LocalVersion { get; set; }
    public Version UpdateVersion { get; set;  }
}


Version est devenu LocalVersion

Si je reprend et modifie le remplissage des List

List<ListFiles> LocalFile = new List<ListFiles>();
LocalFile.Add(new ListFiles{ Name"1", Version new Version("1.1.1.1")});
LocalFile.Add(new ListFiles{ Name"2", Version new Version("1.1.1.1")});
LocalFile.Add(new ListFiles{ Name"3", Version new Version("1.1.1.1")});
LocalFile.Add(new ListFiles{ Name"4", Version new Version("1.1.1.1")});

List<ListFiles> UpdateFile = new List<ListFiles>();
UpdateFile.Add(new ListFiles { Name "1", Version new Version("2.1.1.1") });
UpdateFile.Add(new ListFiles { Name "2", Version new Version("2.1.1.1") });
UpdateFile.Add(new ListFiles { Name "3", Version new Version("2.1.1.1") });
UpdateFile.Add(new ListFiles { Name "5", Version new Version("2.1.1.1") });


Je voudrais me retrouver avec une List représentant se tableaux :

Name > LocalVersion > UpdateVersion
1 > 1.1.1.1 > 2.1.1.1
2 > 1.1.1.1 > 2.1.1.1
3 > 1.1.1.1 > 2.1.1.1
4 > 1.1.1.1 >
5 > > 2.1.1.1

En modifiant se que tu ma généreusement coder, je n'arrive pas a résoudre se petit problème

PS : Tu dit que tu est loin de maîtriser le Linq .... moi je suis encore plus loin alors ^^
Commenter la réponse de cs_Yanith
Messages postés
34
Date d'inscription
mercredi 26 octobre 2005
Statut
Membre
Dernière intervention
24 septembre 2014
0
Merci
Alors LA oui, je dit MAGNIFIQUE

En deux réponse tu ma appris quelques méthodes qui pourrons me simplifier la vie pour d'autre projet, merci encore
Commenter la réponse de cs_Yanith
Messages postés
13978
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 novembre 2019
319
0
Merci
De rien


Whismeril
Commenter la réponse de Whismeril
Messages postés
735
Date d'inscription
jeudi 19 décembre 2002
Statut
Membre
Dernière intervention
22 novembre 2016
3
0
Merci
Bonjour,

Et faire une nouvelle List pouvant contenir les deux types et utiliser AddRange() sur les deux précédentes ?


../\_/\..
.( o.o ). ~ ElGuevel ~
..> - <..
Commenter la réponse de elguevel