En bref: j'ai 2 collections d'objets. L'un contient de bonnes valeurs (appelons-le "Bon"), les autres valeurs par défaut ("Default"). Je veux l'Intersection de l'Union entre le bien et le défaut, et le défaut. En d'autres termes: Intersect (Union (Good, Default), Default). On pourrait penser qu'il se résout en Default, mais voici où cela devient difficile: J'utilise un IEqualityComparer personnalisé.Intersection avec un IEqualityComparer personnalisé à l'aide de Linq
je suis arrivé les classes suivantes:
class MyClass
{
public string MyString1;
public string MyString2;
public string MyString3;
}
class MyEqualityComparer : IEqualityComparer<MyClass>
{
public bool Equals(MyClass item1, MyClass item2)
{
if(item1 == null && item2 == null)
return true;
else if((item1 != null && item2 == null) ||
(item1 == null && item2 != null))
return false;
return item1.MyString1.Equals(item2.MyString1) &&
item1.MyString2.Equals(item2.MyString2);
}
public int GetHashCode(MyClass item)
{
return new { item.MyString1, item.MyString2 }.GetHashCode();
}
}
Voici les caractéristiques de mes collections bonnes et collections par défaut:
Par défaut: Il est un grand ensemble, contenant toutes les paires voulaient {de LaChaine1, LaChaine2} , mais les valeurs MyString3 sont, comme vous pouvez le deviner, les valeurs par défaut. Bon: C'est un ensemble plus petit, contenant principalement des éléments qui sont dans le jeu par défaut, mais avec de bonnes valeurs MyString3. Il a aussi {MyString1, MyString2} qui sont en dehors de l'ensemble voulu. Ce que je veux faire est ceci: Ne prenez que les éléments de Good qui sont dans Default, mais ajoutez les autres éléments dans Default à cela.
Voici, ce que je pense est, mieux essayer mon:
HalfWantedResult = Good.Union(Default, new MyEqualityComparer());
WantedResult= HalfWantedResult.Intersect(Good, new MyEqualityComparer());
je l'ai enseigné aurait travaillé, mais le résultat que je reçois est fondamentalement que le bien {LaChaine1, LaChaine2} paires définies, mais tous provenant de l'ensemble par défaut, donc j'ai la valeur par défaut tout au long. J'ai aussi essayé de changer le Default et le Good du dernier Intersect, mais j'ai le même résultat.
Votre Equals mise en œuvre est vraiment mauvais.Il y aura des collisions de hachage qui ne devraient pas être là. Pourquoi ne pas utiliser la même projection ('new {item.MyString1, item.MyString2}') mais appeler Equals? –
Je devrais regarder dans ceci, cela pourrait faire partie du problème. L'Union utilise GetHashCode et Intersects utilise les Equals. Je n'ai pas vraiment enseigné dans cette partie. * honte * – Tipx