Пересечение с настраиваемым компаратором IEqualityComparer с использованием Linq

Короче говоря: у меня есть 2 коллекции объектов. Один содержит хорошие значения (назовем его «Хорошо»), другой - значения по умолчанию (г-н «По умолчанию»). Я хочу Пересечение союза между добром и невыполнением обязательств и невыполнением обязательств. Другими словами: Пересечение (Союз (Хорошо, По умолчанию), По умолчанию). Кто-то может подумать, что он разрешается как Default, но здесь это становится сложным: я использую собственный IEqualityComparer.

Я получил следующие классы:

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();
    }
}

Вот характеристики моих коллекций Good и Default:

Default: это большой набор, содержащий все требуемые пары {MyString1, MyString2}, но значения MyString3, как вы можете догадаться, являются значениями по умолчанию.

Хорошо: это меньший набор, содержащий в основном элементы из набора по умолчанию, но с некоторыми хорошими значениями MyString3. В нем также есть некоторые {MyString1, MyString2}, которые находятся за пределами требуемого набора.

Я хочу сделать следующее: взять только те элементы из Good, которые находятся в Default, но добавить к нему другие элементы в Default.

Вот, что я думаю, моя лучшая попытка:

HalfWantedResult = Good.Union(Default, new MyEqualityComparer());
WantedResult= HalfWantedResult.Intersect(Good, new MyEqualityComparer());

Я учил, что это должно было сработать, но результат, который я получаю, в основном состоит только из хороших пар {MyString1, MyString2}, но все из набора по умолчанию, поэтому у меня есть значение по умолчанию. Я также попытался переключить Default и Good последнего Intersect, но получил тот же результат.

14
задан Tipx 2 December 2010 в 22:03
поделиться