C# 具有具体类键的GroupBy

C# 具有具体类键的GroupBy,c#,.net,C#,.net,我尝试使用GroupBy,而不是匿名类型,而是具体类作为键。我重写了Equals方法。这没用。我看到了使用具体类型作为键的问题,但没有提到使用它会有任何问题。 调试会话结果在附加的映像中 类程序 { 静态void Main(字符串[]参数) { DateTime val=DateTime.Now; bool testEquality=新类别2(val)==新类别2(val); bool testEquality2=新类2(val).等于(新类2(val)); bool testEquality3

我尝试使用GroupBy,而不是匿名类型,而是具体类作为键。我重写了Equals方法。这没用。我看到了使用具体类型作为键的问题,但没有提到使用它会有任何问题。 调试会话结果在附加的映像中

类程序
{
静态void Main(字符串[]参数)
{
DateTime val=DateTime.Now;
bool testEquality=新类别2(val)==新类别2(val);
bool testEquality2=新类2(val).等于(新类2(val));
bool testEquality3=new Class2(val).Equals(new Class2(val.AddDays(1));
列表=新列表
{
新类别1(1,val),
新类别1(2,val.AddHours(1)),
新类别1(2,val.AddHours(2)),
新类别1(2,val.AddHours(1)),
新类别1(2,val.AddHours(1)),
};
var grouped=list.GroupBy(x=>newclass2(x.prop2));
}
}
内部类1
{
公共int prop1;
公共日期时间prop2;
公共类1(int v1,DateTime v2)
{
prop1=v1;
prop2=v2;
}
}
内部类别2
{
公共日期时间prop2;
公共类2(日期时间v)
{
prop2=v;
}
公共覆盖布尔等于(对象对象对象)
{
返回this.prop2==((Class2)obj).prop2;
}
}

您还需要重写Class2中的GetHashCode

internal class Class2
{
    public DateTime prop2;
    public Class2(DateTime v)
    {
        prop2 = v;
    }
    public override bool Equals(object obj)
    {
        return this.prop2 == ((Class2)obj).prop2;
    }

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

覆盖等于时的最佳实践:


您需要实现
==
=
运算符,所有的
Equals
方法
GetHashCode
都可以在C#中进行“正确”的相等性检查。下面是一个例子

public class Class2
{
    public DateTime prop2;
    public Class2(DateTime v)
    {
        prop2 = v;
    }

    public static bool operator ==(Class2 a, Class2 b)
    {
        if (ReferenceEquals(a, b))
        {
            return true;
        }

        return (object)a != null && a.Equals(b);
    }

    public static bool operator !=(Class2 a, Class2 b)
    {
        return !(a == b);
    }

    public override bool Equals(object obj)
    {
        return Equals(obj as Class2);
    }

    protected bool Equals(Class2 other)
    {
        return other != null && prop2.Equals(other.prop2);
    }

    public override int GetHashCode()
    {
        return prop2.GetHashCode();
    }
}

到底是什么问题?您所面临的错误是什么?@Evg您期望的
testEquality
的值是什么?另外,您希望
newclass2(val).Equals(“”)的结果是什么?或者
newclass2(val).Equals(null)
?我测试了发布的示例代码,分组从5个不同的更改为3个(参见屏幕截图)。我想这就是OP试图克服的问题?对于您的代码,
testEquality
的值是多少?
public class Class2
{
    public DateTime prop2;
    public Class2(DateTime v)
    {
        prop2 = v;
    }

    public static bool operator ==(Class2 a, Class2 b)
    {
        if (ReferenceEquals(a, b))
        {
            return true;
        }

        return (object)a != null && a.Equals(b);
    }

    public static bool operator !=(Class2 a, Class2 b)
    {
        return !(a == b);
    }

    public override bool Equals(object obj)
    {
        return Equals(obj as Class2);
    }

    protected bool Equals(Class2 other)
    {
        return other != null && prop2.Equals(other.prop2);
    }

    public override int GetHashCode()
    {
        return prop2.GetHashCode();
    }
}