Est-il un moyen pour avoir la différence entre deux ensembles d'objets en c#
Je veux obtenir la différence entre deux ensembles d'entiers en c#. Compte tenu de la s1 et la s2, je veux le retour de ces entiers qui sont dans s1 et pas dans s2. Je peux faire quelque chose comme:
List<int> s1 = new List<int>();
List<int> s2 = new List<int>();
foreach (int i in s1)
{
if (s1.Contains(i))
{
//
}
else
{
//
}
}
Mais je me demandais si quelqu'un peut indiquer quelque chose de plus propre. Je voudrais faire quelque chose comme
List<int> omitted = s1.Difference(s2);
Vous ne savez pas si il existe une méthode ou d'un LINQ construire que quelqu'un pourrait être en mesure de préciser? Merci.
OriginalL'auteur SiC | 2009-04-30
Vous devez vous connecter pour publier un commentaire.
Je pense que vous voulez HashSet.Sauf. C'est, plutôt que d'utiliser des Listes, utilisez HashSets, puis l'opération est disponible. C'est un meilleur type, si ce que vous représentez, c'est vraiment un " set " de toute façon. (Si vous avez déjà une liste, il vous suffit de créer un "new HashSet').
L'exception est une extension de la fonction, non?
Il y a une méthode d'extension Énumérable.Sauf pour tous les IEnumerables. Mais HashSet a une méthode à l'Exception spécifiquement pour HashSets.
L'exception est en effet une méthode d'extension qui fonctionne sur n'importe quel IEnumerable (voir msdn.microsoft.com/en-us/library/...). Cela signifie qu'il fonctionne bien sur la Liste<T>. Bien sûr, si l'ordre n'a pas d'importance HashSet /est/ un plus type approprié.
Brian, je ne le pense pas. La méthode ci-dessus est la méthode d'extension. HashSet a un ExceptWith méthode destructive supprime les éléments dans le paramètre à partir de l'instance HashSet, mais pas de l'Exception.
OriginalL'auteur
Est-ce un problème? 🙂
Problème? Non, je voulais juste aider quelqu'un qui pourrait couper-coller ce code et de trouver que cela ne compile pas.
La même mise en garde s'applique également à votre propre réponse. HashSet ne pas mettre en œuvre son propre Sauf la méthode, donc votre réponse nécessite Système.Linq trop.
Mais le vôtre exécuter en O(n^2) et la mine en O(n) 🙂
OriginalL'auteur
OriginalL'auteur
OriginalL'auteur
Voici deux méthodes d'extension qui peut être pratique lorsque vous avez besoin de trouver non ordonnée des différences entre les deux IEnumerable (c'est plus ou moins la même que la réponse donnée par leppie wrapper dans les méthodes d'extension):
OriginalL'auteur
Autre API, obtenir le symétrique différence:
HashSet.SymmetricExceptWith()
OriginalL'auteur