长话短说:我有2个对象集合。一个包含很好的值(我们称之为“良好”),其他的默认值(先生“默认”)。我想要在“良好”和“默认”之间的联盟交叉点,以及“默认”。换句话说:相交(联盟(好,默认),默认)。有人可能会认为它解决为默认,但这里是棘手的地方:我使用自定义的IEqualityComparer。使用Linq与自定义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();
}
}
这是我收藏好,并默认集合的特点:
默认:这是一个大组,包含了所有的希望{MyString1,MyString2}对,但你可以猜到MyString3的值是默认值。
好:它是一个较小的集合,主要包含默认集合中的项目,但具有一些好的MyString3值。它也有一些{MyString1,MyString2}在想要的集合之外。
我想要做的是:只从Good中的项目处于默认状态,但将Default中的其他项目添加到该项目中。
这里,我的想法是,我最好的尝试:
HalfWantedResult = Good.Union(Default, new MyEqualityComparer());
WantedResult= HalfWantedResult.Intersect(Good, new MyEqualityComparer());
我教它应该有工作,但结果我得到的是基本上只有良好{MyString1,MyString2}对置,但是所有来自默认设置,所以我有所有的默认值。我也尝试切换最后一个Intersect的Default和Good,但是我得到了相同的结果。
你的Equals实现是非常糟糕的。会有散列冲突,不应该在那里。为什么不使用相同的投影(`new {item.MyString1,item.MyString2}`)但调用Equals? – 2010-12-02 21:48:11
我应该看看这个,它可能是问题的一部分。 Union使用GetHashCode,Intersects使用Equals。我没有真正把任何教育纳入这一部分。 *惭愧* – Tipx 2010-12-02 21:51:20