Accueil > > > DIFFÉRENTIELLE ENTRE DEUX COLLECTION
DIFFÉRENTIELLE ENTRE DEUX COLLECTION
Information sur la source
Description
L’extension suivante vous permettra de faire très facilement le différentielle entre deux collection IEnumerable le but: comparer deux collection, puis identifier les élément "en trop", "en plus" et "a mettre à jour" les éléments des deux collections doivent implémenter l'interface IPrimaryKey (pour la comparaison des éléments) exemple d'utilisation: listA.diffObjectToAdd(listB); listA.diffObjectToRemove(listB); listA.diffObject ToUpdate(listB);
Source
- // IPrimaryKey :
-
- public interface IPrimaryKey
- {
- int PrimaryKeyValue{get;}
- }
-
- // Extention :
-
- public static class EnumerableExtention
- {
-
- private static List<int> GetIds(IEnumerable<IPrimaryKey> list)
- {
- if (list == null) return new List<int>();
- return list.Select(it => it.PrimaryKeyValue).ToList();
- }
-
-
- public static IEnumerable<T> diffObjectToRemove<T>(this IEnumerable<T> source, IEnumerable<IPrimaryKey> list)
- where T : class, IPrimaryKey
- {
- if (source == null) return new List<T>();
- var listIdsFrom = GetIds(list);
- var listIdsTo = GetIds(source);
- var idsToDelete = listIdsTo.Except(listIdsFrom);
- return source.Where(it => idsToDelete.Contains(it.PrimaryKeyValue)).ToList();
- }
-
- public static IEnumerable<T> diffObjectToAdd<T>(this IEnumerable<IPrimaryKey> source, IEnumerable<T> list)
- where T : class, IPrimaryKey
- {
- if (list == null) return new List<T>();
- var listIdsFrom = GetIds(list);
- var listIdsTo = GetIds(source);
- var idsToAdd = listIdsFrom.Except(listIdsTo);
- return list.Where(it => idsToAdd.Contains(it.PrimaryKeyValue)).ToList();
- }
-
- public static IEnumerable<T> diffObjectToUpdate<T>(this IEnumerable<T> source, IEnumerable<IPrimaryKey> list)
- where T : class, IPrimaryKey
- {
- if (source == null) return new List<T>();
- var listIdsFrom = GetIds(list);
- var listIdsTo = GetIds(source);
- var idsToUpdate = listIdsTo.Intersect(listIdsFrom);
- return source.Where(it => idsToUpdate.Contains(it.PrimaryKeyValue)).ToList();
- }
- }
// IPrimaryKey :
public interface IPrimaryKey
{
int PrimaryKeyValue{get;}
}
// Extention :
public static class EnumerableExtention
{
private static List<int> GetIds(IEnumerable<IPrimaryKey> list)
{
if (list == null) return new List<int>();
return list.Select(it => it.PrimaryKeyValue).ToList();
}
public static IEnumerable<T> diffObjectToRemove<T>(this IEnumerable<T> source, IEnumerable<IPrimaryKey> list)
where T : class, IPrimaryKey
{
if (source == null) return new List<T>();
var listIdsFrom = GetIds(list);
var listIdsTo = GetIds(source);
var idsToDelete = listIdsTo.Except(listIdsFrom);
return source.Where(it => idsToDelete.Contains(it.PrimaryKeyValue)).ToList();
}
public static IEnumerable<T> diffObjectToAdd<T>(this IEnumerable<IPrimaryKey> source, IEnumerable<T> list)
where T : class, IPrimaryKey
{
if (list == null) return new List<T>();
var listIdsFrom = GetIds(list);
var listIdsTo = GetIds(source);
var idsToAdd = listIdsFrom.Except(listIdsTo);
return list.Where(it => idsToAdd.Contains(it.PrimaryKeyValue)).ToList();
}
public static IEnumerable<T> diffObjectToUpdate<T>(this IEnumerable<T> source, IEnumerable<IPrimaryKey> list)
where T : class, IPrimaryKey
{
if (source == null) return new List<T>();
var listIdsFrom = GetIds(list);
var listIdsTo = GetIds(source);
var idsToUpdate = listIdsTo.Intersect(listIdsFrom);
return source.Where(it => idsToUpdate.Contains(it.PrimaryKeyValue)).ToList();
}
}
Conclusion
// exemple utilisation : public class A : IPrimaryKey { public int id = 0;
#region IPrimaryKey Members
public int PrimaryKeyValue { get { return id; } }
#endregion }
public class B : IPrimaryKey { public int id = 0;
#region IPrimaryKey Members
public int PrimaryKeyValue { get { return id; } }
#endregion }
//Dans le code:
List<A> listA = new List<A>(); List<B> listB = new List<B>();
for (var i = 1; i < 10; i++) { listA.Add(new A() { id = i }); }
for (var i = 5; i < 15; i++) { listB.Add(new B() { id = i }); }
foreach (var item in listA.diffObjectToAdd(listB)) Console.WriteLine( "Add: {0} {1}", item.id, item.GetType().Name); foreach (var item in listA.diffObjectToRemove(listB)) Console.WriteLi ne("Remove: {0} {1}", item.id, item.GetType().Name); foreach (var item in listA.diffObjectToUpdate(listB)) Console.WriteLi ne("Update: {0} {1}",+item.id,item.GetType().Name); Add: 10 B Add: 11 B Add: 12 B Add: 13 B Add: 14 B Remove: 1 A Remove: 2 A Remove: 3 A Remove: 4 A Update: 5 A Update: 6 A Update: 7 A Update: 8 A Update: 9 A
Historique
- 16 janvier 2012 17:15:27 :
- ajouts Conclusion
ajouts .zip
- 25 janvier 2012 17:44:04 :
- ajout des tests "if null";
ajout .ToList()
- 25 janvier 2012 17:46:11 :
- mis à jour description
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
List Default comparer [ par olibara ]
BonjourJ'ai constitué une liste composée d'elements (classes) contenant 2 int et un stringJe veux trier cette liste sur le premier int de la classeDoi
comparer deux textes de deux fomres different [ par traod ]
bon soir tous le monde,voila ds une application console, g un texte ecri dans une forme1 (ds 1 textbox), et g un autre texte que je voudrai ecrire dan
Reflection et Instances d'attributs [ par t00f ]
Bonjour,J'ai un objet List<T>.Je veux que T soit en fonction d'un objet récupérer par réflexion. Je l'ai récupéré mais je sais pas comment l'écr
Reflection sur une liste [ par t00f ]
Bonjour à tous,Je reviens vers vous pour une nouvelle question sur la reflexion.J'ai une class qui possède une List d'objet B, avec B qui hérite de la
Comparer un string avec un int [ par kerma26 ]
Bonjour tout le monde,Encore un problème pour moi, je cherche à comparer un string avec un entier :ex :if (String.Compare(path, int) == 0)je voudrais
Comparer deux classeurs excel [ par math1991 ]
Voici mon problème,J'ai deux feuilles excel avec 9 en-têtes de colonnes identiques et environ 27000 lignesJe souhaiterai comparer chaque ligne et insé
Modifier Constructeur List<> [ par Jleherpeur ]
Bonjour,j'ai ceci:private Liste<TextBox> myObjects = new Liste<TextBox>();public class Liste<TextBox> : List<TextBox>{ privat
Comment comparer deux chaines de caractére en C#? [ par sghchafaa ]
Bonjour;Je veut faire une boucle do...while qui se repete tant que l'entier saisie n'est pas entre 1et5voila une idéé sur le source: do {
Comment Manipulier un fichier dans C#?? [ par sghchafaa ]
Bonjour,Je suis un débutant en programmation,et par conseille d'un professionnel,j'ai choisie le C#.Alors j'y commence depuis 15 jours,et je cherche m
DataBind et mise a jour des donnes [ par Link214 ]
Bonjours j ai un petit souci avec la mise a jours des données qui me servent dans un databind ... J ai un pool de données que je regroupe dans une li
|
Derniers Blogs
ETENDRE LE TEAM WEB ACCESS DE TFS 2012 - STEP 0ETENDRE LE TEAM WEB ACCESS DE TFS 2012 - STEP 0 par Philess
L'extensibilité du Team Web Access
Le Web Access (site d'équipe) de Team Foundation Server a été complètement réécrit dans la version 2012 avec pas moins de 400.000 lignes de JavaScript. Ce nouveau modèle a été pensé pour offrir de grandes...
Cliquez pour lire la suite de l'article par Philess SIMULER FACILEMENT L'ENVOI DE MAILSIMULER FACILEMENT L'ENVOI DE MAIL par JeremyJeanson
il m'a été demandé, à plusieurs reprises, comment je faisais pour simuler l'envoi de mail lors de mes démos de Workflow Foundation. Ma solution est plutôt simple : j'utilise la configuration par défaut du SmtpClient et j'oriente les mails vers un dossier ...
Cliquez pour lire la suite de l'article par JeremyJeanson VOTEZ POUR LE TOP 10 DES INFLUENCEURS SHAREPOINT FRANCOPHONES !VOTEZ POUR LE TOP 10 DES INFLUENCEURS SHAREPOINT FRANCOPHONES ! par Patrick Guimonet
Si ce n'est déjà fait (comme plus de 600 personnes déjà), il est encore temps de voter pour le concours TOP 10 des influenceurs SharePoint francophones ! Il est organisé par harmon.ie et accessible ici : http://harmon.ie/top-...
Cliquez pour lire la suite de l'article par Patrick Guimonet [CONF'SHAREPOINT] DERNIER RAPPEL ! :-)[CONF'SHAREPOINT] DERNIER RAPPEL ! :-) par Patrick Guimonet
La Conf'SharePoint en chiffres c'est : 3 jours de SharePoint ! 4 parcours et 60 sessions 17 partenaires représentant toutes les fac...
Cliquez pour lire la suite de l'article par Patrick Guimonet
Logiciels
Easy-Planning (4.5.0.11)EASY-PLANNING (4.5.0.11)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté a... Cliquez pour télécharger Easy-Planning CVEasy (3.1.0.51)CVEASY (3.1.0.51)PHMSD-CVEasy est un logiciel d'aide à la rédaction de CV d'une simplicité déconcertante.
PHMSD-C... Cliquez pour télécharger CVEasy LettresFaciles 2011 (8.6.0.31)LETTRESFACILES 2011 (8.6.0.31)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011 sDEVIS-FACTURES vlPRO (8.4.2.62)SDEVIS-FACTURES VLPRO (8.4.2.62)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO Devis-Factures PHMSD (2.1.0.11)DEVIS-FACTURES PHMSD (2.1.0.11)Configuration minimale
Nécessite Windows™ 2000, XP, Windows 7, 8, Vista (Service Pack à... Cliquez pour télécharger Devis-Factures PHMSD
|