在不同类型上实现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的罚款。

感谢

在不同类型上实现IEquatable

在我看来,这段代码看起来真的很奇怪:

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))