【发布时间】:2010-12-02 21:44:25
【问题描述】:
长话短说:我有 2 个对象集合。一个包含好的值(我们称它为“Good”),另一个包含默认值(Mr.“Default”)。我想要 Good 和 Default 以及 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 收藏品:
默认值:这是一个很大的集合,包含所有想要的 { MyString1, MyString2 } 对,但 MyString3 值是您可以猜到的默认值。
Good :这是一个较小的集合,主要包含默认集合中的项目,但具有一些好的 MyString3 值。它还有一些 { MyString1, MyString2 } 超出了想要的集合。
我想要做的是:只从 Good 中取出 Default 中的项目,但将 Default 中的其他项目添加到该项目中。
这是,我认为是,我最好的尝试:
HalfWantedResult = Good.Union(Default, new MyEqualityComparer());
WantedResult= HalfWantedResult.Intersect(Good, new MyEqualityComparer());
我教它应该可以工作,但我得到的结果基本上只有好的 { MyString1, MyString2 } 对集,但都来自默认集,所以我有默认值。我也尝试切换最后一个相交的默认和良好,但我得到了相同的结果。
【问题讨论】:
-
你的 Equals 实现真的很糟糕。会有不应该存在的哈希冲突。为什么不使用相同的投影 (
new { item.MyString1, item.MyString2 }) 而是调用 Equals? -
我应该调查一下,这可能是问题的一部分。 Union 使用 GetHashCode,Intersects 使用 Equals。我还没有真正投入任何教导。 惭愧
标签: c# linq intersection intersect