gpt4 book ai didi

c# - IEquatable 不调用 Equals 方法

转载 作者:行者123 更新时间:2023-11-30 19:40:09 27 4
gpt4 key购买 nike

嗯,我遇到了 IEquatable (C#) 的问题。正如您在下面的代码中看到的,我得到了一个实现了 IEquatable 的类,但是它的“Equals”方法无法实现。我的目标是:我的数据库中有一个日期时间列,我只想区分日期,而不考虑“时间”部分。

例如:12-01-2014 23:14 将等于 12-01-2014 18:00。

namespace MyNamespace
{
public class MyRepository
{
public void MyMethod(int id)
{
var x = (from t in context.MyTable
where t.id == id
select new MyClassDatetime()
{
Dates = v.Date
}).Distinct().ToList();
}
}


public class MyClassDatetime : IEquatable<MyClassDatetime>
{
public DateTime? Dates { get; set; }

public bool Equals(MyClassDatetime other)
{
if (other == null) return false;
return (this.Dates.HasValue ? this.Dates.Value.ToShortDateString().Equals(other.Dates.Value.ToShortDateString()) : false);
}

public override bool Equals(object other)
{
return this.Equals(other as MyClassDatetime );
}

public override int GetHashCode()
{
int hashDate = Dates.GetHashCode();
return hashDate;
}
}
}

你知道我怎样才能让它正常工作或其他选择来做我需要的吗?谢谢!!

最佳答案

您的 GetHashCode 实现对于所需的相等语义是不正确的。那是因为它为您想要比较相等的日期返回不同的哈希码,which is a bug .

要修复它,将其更改为

public override int GetHashCode()
{
return Dates.HasValue ? Dates.Value.Date.GetHashCode() : 0;
}

您还应该本着同样的精神更新 Equals,混淆日期的字符串表示不是一个好主意:

public bool Equals(MyClassDatetime other)
{
if (other == null) return false;
if (Dates == null) return other.Dates == null;
return Dates.Value.Date == other.Dates.Value.Date;
}

更新:作为 usr very correctly points out ,因为您在 IQueryable 上使用 LINQ,投影和 Distinct 调用将被转换为存储表达式,并且此代码仍然不会运行。要解决这个问题,您可以使用中间 AsEnumerable 调用:

var x = (from t in context.MyTable
where t.id == id
select new MyClassDatetime()
{
Dates = v.Date
}).AsEnumerable().Distinct().ToList();

关于c# - IEquatable 不调用 Equals 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24634747/

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