C# 具有具体类键的GroupBy
我尝试使用GroupBy,而不是匿名类型,而是具体类作为键。我重写了Equals方法。这没用。我看到了使用具体类型作为键的问题,但没有提到使用它会有任何问题。 调试会话结果在附加的映像中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
类程序
{
静态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();
}
}