begin process at 2013 05 25 01:51:48
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Astuces

 > DIFFÉRENTIELLE ENTRE DEUX COLLECTION

DIFFÉRENTIELLE ENTRE DEUX COLLECTION


 Information sur la source

Note :
6 / 10 - par 1 personne
6,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Astuces Source .NET ( DotNet ) Classé sous :Differentielle, Collections, Comparer, List, IEnumerable Niveau :Initié Date de création :16/01/2012 Date de mise à jour :25/01/2012 17:46:11 Vu / téléchargé :2 467 / 68

Auteur : morphey_83

Ecrire un message privé
Commentaire sur cette source (4)
Ajouter un commentaire et/ou une note

 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

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 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

Source .NET (Dotnet) RICHTEXTBOX AVEC COLORATION SYNTAXIQUE ET AUTO-INDENTATION S... par badboy38
Source avec Zip Source avec une capture Source .NET (Dotnet) ANYPARSER : ANALYSE D'UN LANGAGE DE PROGRAMMATION PERSO par olivieram2
Source avec Zip Source avec une capture Source .NET (Dotnet) ALTERNATIVE AUX EXPRESSIONS RÉGULIÈRES .NET : ANYPARSER par olivieram2
Source avec Zip Source avec une capture Source .NET (Dotnet) RICHTEXTBOX POUR COLORATION SYNTAXIQUE EN TEMPS REEL par Renfield
Source avec Zip Source avec une capture Source .NET (Dotnet) TRANSFORMER UN PROGRAMME EN SERVICE par xavh44

 Sources en rapport avec celle ci

Source avec Zip CRÉÉR ET/OU RÉSOUDRE UN PUZZLE BINAIRE par thierrydemly
Source .NET (Dotnet) FILTRABLE GENERIC LIST par Dargos
Source .NET (Dotnet) COMPARER DES CHAINES DE CARACTÈRES par B3nJ4m1n

Commentaires et avis

Commentaire de whismeril le 20/01/2012 11:36:33

Bonjour, je ne comprends pas le nom de diffObjectToUpdate, cette fonction retourne les éléments communs aux deux collections mais ne compare pas leur attributs.
De mon point de vue un élément à mettre à jour est un élément commun aux deux collections dont au moins un attribut est différent. Il faut ensuite discriminer laquelle des ces 2 instances sera prise en référence.

Commentaire de morphey_83 le 20/01/2012 12:05:38

Bonjour whismeril,

Ce code sert avant tout à comparer deux collection qui comportent des éléments de différents types par ID (donc les attributs peuvent être différentes )

Le cas d'application :

la collection des VO (Value Objects utilisé dans les échanges client/server ajax  ) est comparé à la collection des objets Entity Framework

Commentaire de morphey_83 le 20/01/2012 12:14:48

la méthode "diffObjectToUpdate" est optionnel.
Elle peut être utilisé dans le cas de mis a jour d'une table en relation:

User
  FirstName, LastName, ...
  List<Contat> Contacts

les éléments de la collection "Contacts" peuvent être supprimé, ajouté ou mise à jour

Commentaire de whismeril le 20/01/2012 12:21:03 6/10

C'est justement ce que je cherche à faire entre un ordinateur et un appareil mobile (téléphone ou tablette) et donc dans mon cas les attributs peuvent être modifiés soit d'un coté ou de l'autre.
Ton code va me permettre de trouver les ajouts ce qui est déjà un bon début pour moi.
Je partirais aussi de cette méthode pour tester les mise à jours, j'ai un champ DateDeModif et un champ UniqueId pour commencer.


 Ajouter un commentaire


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&lt;T&gt;.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&lt;TextBox&gt; myObjects = new Liste&lt;TextBox&gt;();public class Liste&lt;TextBox&gt; : List&lt;TextBox&gt;{  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


Nos sponsors


Sondage...

CalendriCode

Mai 2013
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,106 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales