![](/img/trans.png)
[英]How do I perform a dependency injection to configure extension methods in c#?
[英]How do C# Linq extension methods perform equality comparison?
因此,以下lambda表达式不会返回集合中的任何元素,即使在单步执行时我能够验证1个项目是否符合条件。 我已经用它的IEquatable实现添加了一个类的示例。
...within a method, foo is a method parameter
var singleFoo = _barCollection.SingleOrDefault(b => b.Foo == foo);
以上都没有回报。 有关如何使上述表达式工作的任何建议?
public class Foo: IEquatable<Foo>
{
public string KeyProperty {get;set;}
public bool Equals(Foo other)
{
if (ReferenceEquals(null, other)) return false;
if (ReferenceEquals(this, other)) return true;
return other.KeyProperty==KeyProperty;
}
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (obj.GetType() != typeof (Foo)) return false;
return Equals((Foo) obj);
}
public override int GetHashCode()
{
return (KeyProperty != null ? KeyProperty.GetHashCode() : 0);
}
}
为了确保我没有疯狂,我创建了以下nUnit测试,该测试通过:
[Test]
public void verify_foo_comparison_works()
{
var keyString = "keyValue";
var bar = new Bar();
bar.Foo = new Foo { KeyProperty = keyString };
var basicFoo = new Foo { KeyProperty = keyString };
var fromCollectionFoo = Bars.SingleFooWithKeyValue;
Assert.AreEqual(bar.Foo,basicFoo);
Assert.AreEqual(bar.Foo, fromCollectionFoo);
Assert.AreEqual(basicFoo, fromCollectionFoo);
}
尝试覆盖==和!=:
public static bool operator ==(Foo x, Foo y)
{
if (ReferenceEquals(x, y))
return true;
if ((object)x == null || (object)y == null)
return false;
return x.KeyProperty == y.KeyProperty;
}
public static bool operator !=(Foo x, Foo y)
{
return !(x == y);
}
它们使用EqualityComparer<T>.Default
进行相等比较,使用Comparer<T>.Default
进行有序比较。
MSDN -
EqualityComparer<T>.Default
备注:
Default
属性检查类型T
是否实现System.IEquatable(Of T)
泛型接口,如果是,则返回使用该实现的EqualityComparer(Of T)
。 否则,它返回一个EqualityComparer(Of T)
,它使用由T
提供的Object.Equals
和Object.GetHashCode
的覆盖。MSDN -
Comparer<T>.Default
备注:此属性返回的
Comparer(Of T)
使用System.IComparable(Of T)
泛型接口(C#中的IComparable<T>
,Visual Basic中的IComparable(Of T)
)来比较两个对象。 如果类型T
未实现System.IComparable(Of T)
泛型接口,则此属性返回使用System.IComparable
接口的Comparer(Of T)
。
您没有重新定义==运算符。
改成:
var singleFoo = _barCollection.SingleOrDefault(b => b.Foo.Equals(foo));
您还需要覆盖==运算符 。
我用IdentityKey类(具有隐式Guid转换)遇到了类似的问题 - 在这种情况下,包含== operator
覆盖并不可行。
我说它不可行,因为通过“混合”比较,我现在必须转换类型以避免对==运算符重载的歧义。 即。 而不是if(guidValue = identityKeyValue)
它必须成为if((IdentityKey)guidValue == identityKeyValue)
虽然使用.Equals
是一种解决方案,但对我来说这并不自然吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.