Короче говоря: у меня есть 2 коллекции объектов. Один содержит хорошие значения (назовем его «Хорошо»), другие значения по умолчанию (г-н «По умолчанию»). Я хочу, чтобы Пересечение Союза между Хорошим и По умолчанию и По умолчанию. Другими словами: Intersect (Union (Good, Default), Default). Можно подумать, что он разрешен как Default, но здесь он становится сложным: я использую пользовательский IEqualityComparer.Пересечение с помощью пользовательского IEqualityComparer с использованием Linq
я получил следующие классы:
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();
}
}
Вот характерные моей коллекции Хороших и коллекции по умолчанию:
По умолчанию: Это большой набор, содержащий все хотели {MyString1, MyString2} пары , но значения MyString3, как вы можете догадаться, являются значениями по умолчанию.
Хорошо: это меньший набор, содержащий в основном элементы, которые находятся в наборе по умолчанию, но с некоторыми хорошими значениями MyString3. Он также имеет некоторые {MyString1, MyString2}, которые находятся за пределами желаемого набора.
Что я хочу сделать, так это: Возьмите только предметы из Хороших, которые находятся в разделе «По умолчанию», но добавьте в него другие элементы по умолчанию.
Вот, что я думаю, мой лучший попробовать:
HalfWantedResult = Good.Union(Default, new MyEqualityComparer());
WantedResult= HalfWantedResult.Intersect(Good, new MyEqualityComparer());
Я учил он должен работал, но результат я получаю в основном только хорошее {MyString1, MyString2} набор пар, но все начиная с установленного по умолчанию, поэтому у меня есть значение по умолчанию. Я также попытался переключить Default и Good последнего Intersect, но получаю тот же результат.
Ваша реализация Равно действительно плохо.Будут столкновения хэшей, которых не должно быть. Почему бы не использовать одну и ту же проекцию (`new {item.MyString1, item.MyString2}`), но вызвать Equals? – 2010-12-02 21:48:11
Я должен изучить это, это может быть частью проблемы. Союз использует GetHashCode, а Intersects использует Equals. Я действительно не преподавал эту часть. * стыдно * – Tipx 2010-12-02 21:51:20