我有一个课程:
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的罚款。
由于
答案 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