gpt4 book ai didi

c# - “包含”方法返回 false

转载 作者:太空宇宙 更新时间:2023-11-03 22:17:03 25 4
gpt4 key购买 nike

我遇到了一些奇怪的问题。

我有一个 EntityCollection< T >其中包含一个元素,但 Contains 方法返回 false。

我已经重写了 T 的“Equals”方法,但“Contains”方法没有调用它(虽然在文档中是这样说的)。

当我做 foreach (T x in coll) , x.Equals(element)返回真。

感谢您的帮助。

代码:

contains(object entCol, object val)
{
var coll = (ICollection<GraphicSockets>)entCol;
var socket = val as GraphicSockets;
foreach (GraphicSockets sock in coll)
socket.Equals(sock); //true for first element, GraphicSocket's Equals function called
coll.Contains(socket);//false, Equals function not called}

我真正想使用的代码是

private static bool contains(object entCol, object val)
{
Type entColType = typeof(EntityCollection<>).MakeGenericType(val.GetType());
MethodInfo contains = entColType.GetMethod("Contains");
return (bool)contains.Invoke(entCol, new object[] { val });
}

这工作过一次,但当我开始使用 wcf 时停止了,我想知道这个 contains 方法是如何工作的......

最佳答案

如果您使用以下方法,您的问题是否会消失:

    public override int GetHashCode()
{
return 0;
}

注意这只是一个调试测试,不是真正的建议


现在我们知道这是问题所在,让我解释一下。

您的对象具有强身份 (Equals) 和弱身份 (GetHashCode)。 GetHashCode 标识可以被认为是一个 bin 编号。这些idenitites在插入哈希表后不能改变,否则哈希表操作将停止正常工作。通过让 GetHashCode() 返回 0,我给了它所有身份中最弱的一个,“每个人都在同一个箱子里”,但它没有改变。

请注意,GetHashCode() 只是一种性能增强,如果您对性能感到满意,那么您就完成了。如果不是,另一个简单的哈希码是对 Equal 方法中使用的所有比较进行异或运算。像这样的东西:

return LastName.GetHashCode() ^ FirstName.GetHashCode();

记住 GetHashCode() 是一种性能增强,不要花太多时间计算它。也许在上述情况下,以下可能是性能更好的哈希码:

return LastName.GetHashCode();

关于c# - “包含”方法返回 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4705656/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com