List1
contient des éléments { A, B }
et List2
contient des éléments { A, B, C }
.
Ce dont j'ai besoin, c'est d'être retourné { C }
Lorsque j'utilise à l'extension LINQ. Au lieu de cela, je suis retourné { A, B }
Et si je retourne les listes dans mon expression, le résultat est { A, B, C }
.
Suis-je mal comprendre le point de sauf? Y a-t-il une autre extension que je ne vois pas à utiliser?
J'ai parcouru et essayé un certain nombre de postes différents à ce sujet sans succès jusqu'à présent.
var except = List1.Except(List2); //This is the line I have thus far
EDIT: Oui je comparais comparer des objets simples. Je n'ai jamais utilisé IEqualityComparer
, il était intéressant d'apprendre.
Merci tout pour l'aide. Le problème n'ayant pas mis en œuvre le comparateur. Le poteau de blog lié et l'exemple ci-dessous sont utiles.
Si vous stockez des types de référence dans votre liste, vous devez vous assurer qu'il existe un moyen de comparer les objets pour l'égalité. Sinon, ils seront vérifiés en comparant s'ils se réfèrent à la même adresse.
Vous pouvez implémenter IEqualityComparer<T>
et l'envoyer comme un paramètre à sauf () fonction. Voici un blog post Vous trouverez peut-être utile.
Modifier: le lien Blog original post-lien était cassé et a été remplacé ci-dessus
Donc, juste pour la complétude ...
// Except gives you the items in the first set but not the second
var InList1ButNotList2 = List1.Except(List2);
var InList2ButNotList1 = List2.Except(List1);
// Intersect gives you the items that are common to both lists
var InBothLists = List1.Intersect(List2);
EDIT: Étant donné que vos listes contiennent des objets que vous devez transmettre un iéquitycomparer pour votre classe ... Voici ce que votre sauf ressemblera à un exemple d'ineéquitycomparateur basé sur des objets maquillés ... :
// Except gives you the items in the first set but not the second
var equalityComparer = new MyClassEqualityComparer();
var InList1ButNotList2 = List1.Except(List2, equalityComparer);
var InList2ButNotList1 = List2.Except(List1, equalityComparer);
// Intersect gives you the items that are common to both lists
var InBothLists = List1.Intersect(List2);
public class MyClass
{
public int i;
public int j;
}
class MyClassEqualityComparer : IEqualityComparer<MyClass>
{
public bool Equals(MyClass x, MyClass y)
{
return x.i == y.i &&
x.j == y.j;
}
public int GetHashCode(MyClass obj)
{
unchecked
{
if (obj == null)
return 0;
int hashCode = obj.i.GetHashCode();
hashCode = (hashCode * 397) ^ obj.i.GetHashCode();
return hashCode;
}
}
}
Vous avez simplement confondu l'ordre des arguments. Je peux voir où cette confusion s'est produite, car la Documentation officielle n'est pas aussi utile que possible:
Produit la différence définie de deux séquences en utilisant le comparateur d'égalité par défaut pour comparer les valeurs.
Sauf si vous êtes versé dans la théorie de la définition, il peut ne pas être clair ce que différence définie . Ce n'est pas simplement ce qui est différent entre les ensembles. En réalité, Except
renvoie la liste des éléments dans le premier ensemble qui ne figurent pas dans le deuxième ensemble.
Essaye ça:
var except = List2.Except(List1); // { C }