在不同类型上实现IEquatable

时间:2013-08-01 19:51:03

标签: c# .net

我有一个课程:

 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()方法检查条形条是否在Foos列表中。到目前为止,我没有运气,而且从我读过的内容来看,如果它们具有定义IEquatable的相同父级或者它们是相同的类型,则只能将类型与IEquatable进行比较。

任何人都知道你是否可以实施

List<Foo> foos.Contains(Bar bar) ?

另外,我想要一个Bars列表,并且能够删除Foos列表中包含的任何内容,以便;

 List<Bar> bars = bars.Where( r => (List<Foo>) !foos.Contains(r)).ToList();  \

这是我需要的最重要的东西,看起来很干净。当然,我可以在每个循环中进行这些比较,但是如果可能的话我想避免这种情况,也许不会支付n * m的罚款。

由于

2 个答案:

答案 0 :(得分:2)

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

foos.Contains(bar)

您如何看待:

foos.Any(f => f.Bar == bar)

更新后的代码 - 我假设您收集了bars,并且您希望排除foos集合中Foos引用的所有条形码:

bars.Except(foos.Select(f => f.Bar))

答案 1 :(得分:1)

Empi对foo.Any(f => f.Bar == bar)的回答看起来很干净,但是如果你想坚持比较 - 使用Enumerable.Contains的另一个覆盖并创建自定义“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并使{{1非对称):

Equals