在不同类型上实现IEquatable
本文关键字:实现 IEquatable 同类型 | 更新日期: 2023-09-27 18:25:55
我有一个这样的类:
public class Foo : IEquatable<Bar>, IComparable{
[DataMember]
public Bar bar;
public override bool Equals(object obj){
//Check if not hte right object, return false;
return this.bar == obj as Bar;
}
public bool Equals(Bar other){
if(this.bar == other){
return this.bar == other;
}
}
}
我希望能够有一个包含条形图的Foo列表,并使用Contains()方法检查条形图是否在Foo列表中。到目前为止,我运气不好,根据我所读到的,你只能将类型与IEquatable进行比较,前提是它们有定义IEquatable的同一个父级,或者它们是相同的类型。
任何人都知道你是否可以实现
List<Foo> foos.Contains(Bar bar) ?
此外,我希望有一个酒吧列表,并能够删除Foo列表中包含的任何酒吧,这样;
List<Bar> bars = bars.Where( r => (List<Foo>) !foos.Contains(r)).ToList(); '
这是我需要的最重要的东西,看起来真的很干净。当然,我可以在每个循环中进行这些比较,但如果可能的话,我想避免这种情况,也许不需要支付n*m的罚款。
感谢
在我看来,这段代码看起来真的很奇怪:
foos.Contains(bar)
你怎么看:
foos.Any(f => f.Bar == bar)
更新后的代码-我假设你有bars
的集合,并且你想排除foos
集合中Foo引用的所有Bar:
bars.Except(foos.Select(f => f.Bar))
Empi对foo.Any(f => f.Bar == bar)
的回答在我看来非常清晰,但如果你想坚持比较,请使用Enumerable的另一个覆盖。包含并创建自定义的"CompareFooByBar"比较器(此外,你仍然需要将Foo
作为搜索词传递,但你可以使用完全伪造的比较器)。
class CompareFooByBar : IEqualityComparer<Foo>
{
public bool Equals(Foo x, Foo y)
{
return x.Bar == y.Bar;
}
public int GetHashCode(Foo x)
{
return x.Bar.GetHashCode();
}
}
用法:
foos.Contains(new Foo{Bar = bar}, new CompareFooByBar())
还有一种选择是完全欺骗,并有一个比较器来简单地与固定值进行比较(但它将依赖于Contains
的内部实现来调用具有特定参数顺序的Equals
,并使Equals
非对称):
class CompareFooToBar : IEqualityComparer<Foo>
{
Bar bar;
public CompareFooToBar(Bar bar) { this.bar = bar;}
public bool Equals(Foo x, Foo y)
{
// hack - ignore y completely, assuming Contains pass element as x
return x.Bar == bar;
}
public int GetHashCode(Foo x)
{
return 0;
}
}
foos.Contains(null, new CompareFooToBar(bar))