gpt4 book ai didi

c# - POCO 标识字段上的 IEquatable

转载 作者:太空宇宙 更新时间:2023-11-03 20:16:43 26 4
gpt4 key购买 nike

我有一个来自 SQL Server 数据库的 POCO,它有一个身份 ID 字段。我想实现 IEquatable 这样我就可以检查它们是否是相同的记录,使用 .Contains()List<T>

假设我永远不需要比较未保存的实例,是否足以实现使用:

    public bool Equals(MyClass other)
{
return this.ID == other.ID;
}

public override int GetHashCode()
{
return this.ID;
}

我正要这样做,但只是想检查一下是否可行,因为我不是 100% 确定 GetHashCode 与它有什么关系,或者是否有任何其他注意事项(例如“未保存的实例”一个,我可以丢弃)我不知道。

最佳答案

您需要覆盖 GetHashCode()每当你覆盖 Equals() (在实现 IEquatable<T> 时也应该这样做)以便依赖它的类,例如 Dictionary<TKey, TValue> ,可以正确处理。这是恼人地泄漏的那些内部细节之一。 More information .

至于比较您的 ID 是否足以确定是否相等,如果您绝对确定具有相同 ID 的两个实体在所有情况下都应被视为等同,那么就去做吧。这是一个只有您的应用程序的要求才能回答的问题。我自己做过很多次,几乎总是使用只读实体。

我会这样实现:

// IEquatable<MyClass> implementation
public bool Equals(MyClass other)
{
if (other == null)
{
return false;
}

return this.ID == other.ID;
}

// Override of default Object.Equals()
public override bool Equals(object other)
{
return this.Equals(other as MyClass);
}

public override int GetHashCode()
{
// Call ID.GetHashCode() because ID may not always be int,
// and the ID type might have a more useful implementation
// of GetHashCode() to offer.
return this.ID.GetHashCode();
}

您可能还应该覆盖 ==!=在这种情况下的运营商。您可以随时使用 Object.ReferenceEquals()如果您想区分具有相同 ID 的两个不同引用。

关于c# - POCO 标识字段上的 IEquatable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16201650/

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