2011-06-17 1 views
1

J'ai 2 listes différentes:Requête SQL - Générer 2 collections en fonction des différences?

public class Foo 
{ 
    public Int32 Id { get; set; } 
} 

ICollection<Foo> OriginalCollection 
ICollection<Foo> NewCollection 

Je veux générer 2 listes pour pouvoir les foreach ...

  • Tous les éléments qui OriginalCollection contient que NewCollection ne (essentiellement, une collection de choses qui ont été enlevées).
  • Tous les éléments que OriginalCollection ne contient pas NewCollection le font (essentiellement, une collection de composants ajoutée).

Je sais que je vais récupérer un IEnumerable avec LINQ, c'est très bien car j'ai besoin de foreach. Je n'ai aucune idée ce que mes questions devraient ressembler à ...


Mise à jour:

J'ai oublié de mentionner que je ne essayer la clause except ... il a échoué parce que les objets ne sont pas le même. Ils contiennent uniquement le même ID.

+0

[101 échantillons LINQ] (http://msdn.microsoft.com/en-us/vcsharp/aa336746) – Oded

Répondre

1

Donc, vous voulez le complément de l'ensemble. Ce poste semble répondre à vos besoins:

Quickest way to find the complement of two collections in C#

Ou peut-être la méthode Enumerable.Except:

http://msdn.microsoft.com/en-us/library/system.linq.enumerable.except.aspx

+0

Je mis à jour ma question b/c j'oublié de mentionner que je l'ai fait essayez le 'Except' mais il a échoué parce que les objets ne sont pas les mêmes, ils contiennent seulement le même Id. – michael

+0

Avez-vous consulté mon premier lien? Il décrit comment spécifier votre propre EualityComparer personnalisé afin qu'Except fonctionne comme vous le souhaitez. – mtazva

+0

alors ... le lien # 1 est le double de ma question. Impressionnant. – michael

0
using System.Linq; 

originalC.Except(newC, comparer); 
newC.Except(originalC, comparer); 

Après modification:

Vous pouvez utiliser la surcharge cela prend un "IEqualityComparer".

Vous pouvez définir une petite classe qui implémente cette interface avec n'importe quel type de logique de comparaison.

+0

J'ai mis à jour ma question b/c J'ai oublié de mentionner que j'ai essayé le 'Except' mais il a échoué parce que les objets ne sont pas les mêmes, ils ne contiennent que le même Id. – michael

0

Vous cherchez opérateur Sauf

http://msdn.microsoft.com/en-us/vcsharp/aa336761.aspx#except1

NewCollection -sauf> OriginalCollection = supprimé

OriginalCollection -sauf> = NewCollection ajouté

+0

J'ai mis à jour ma question b/c J'ai oublié de mentionner que j'ai essayé le 'Except' mais il a échoué parce que les objets ne sont pas les mêmes, ils ne contiennent que le même Id. – michael

0
List<Foo> original = ... 
List<Foo> modified = ... 
... 
var deleted = original.Except(modified); 
var added = modified.Except(original); 

Vous pouvez utiliser explicitement LINQ mais ce n'est pas vraiment la peine. Une façon pourrait être:

var deleted = from i in original 
       where !modified.Contains(i) 
       select i; 

var added = from i in modified 
      where !original.Contains(i) 
      select i; 
+0

J'ai mis à jour ma question b/c J'ai oublié de mentionner que j'ai essayé le 'Except' mais il a échoué parce que les objets ne sont pas les mêmes, ils ne contiennent que le même Id. – michael

Questions connexes