我需要同步在线数据库和本地数据库的约会。 到目前为止,这是我的代码:
List<Appointment> onlineAppointments = new List<Appointment>();
List<Appointment> localAppointments = new List<Appointment>();
Appointment appointment01 = new Appointment(new DateTime(2012, 12, 24, 17, 30, 00), new DateTime(2012, 12, 24, 17, 45, 00), name, 123, "comment", 0, "test", 123, 1, DateTime.Now);
Appointment appointment02 = new Appointment(new DateTime(2012, 12, 24, 17, 30, 00), new DateTime(2012, 12, 24, 17, 45, 00), name, 123, "comment", 0, "test", 123, 1, DateTime.Now);
onlineAppointments.Add(appointment01);
localAppointments.Add(appointment02);
因为我只想比较我创建IEqualityComparer的对象的一些属性:
public class AppointmentEqualityComparer<T> : IEqualityComparer<T> where T : Appointment
{
#region IEqualityComparer<T> Members
public bool Equals(T x, T y)
{
return (x == null && y == null) || ((x != null && y != null) &&
(x.getAppointmentStart() == y.getAppointmentStart() &&
x.getAppointmentEnd() == y.getAppointmentEnd())
);
}
/// </exception>
public int GetHashCode(T obj)
{
if (obj == null)
{
throw new ArgumentNullException("obj");
}
return obj.GetHashCode();
}
#endregion
}
不幸的是,这不起作用:
var comparer = new AppointmentEqualityComparer<Appointment>();
IEnumerable<Appointment> diffOnlineOffline = onlineAppointments.Except(localAppointments, comparer);
含义diffOnlineOffline不为空,但应该是因为两个列表都包含相同的约会。
有什么想法吗?
答案 0 :(得分:2)
您的GetHashCode
方法应使用用于相等的属性。目前,您想要考虑的对象可能没有相同的哈希码。
您可以使用以下内容:
public int GetHashCode(T obj)
{
return 41 * (41 * (41 * (41 + obj.getAppointmentStart().GetHashCode()))
+ obj.getAppointmentEnd().GetHashCode());
}
答案 1 :(得分:1)
我怀疑问题出在getAppointmentStart
和getAppointmentEnd
方法上。以下是具有相同等式比较器的简洁版本的代码,但使用的属性按预期工作:
public class Appointment
{
private int Id { get; set; }
public DateTime Start { get; set; }
public DateTime End { get; set; }
public Appointment( int id, DateTime start, DateTime end )
{
Start = start;
End = end;
Id = id;
}
}
public class AppointmentEqualityComparer<T> : IEqualityComparer<T> where T : Appointment
{
#region IEqualityComparer<T> Members
public bool Equals( T x, T y )
{
return ( x == null && y == null )
|| ( ( x != null && y != null ) && ( x.Start == y.Start && x.End == y.End ) );
}
public int GetHashCode( T obj )
{
if( obj == null )
{
throw new ArgumentNullException( "obj" );
}
return obj.GetHashCode();
}
#endregion
}
实施:
var onlineAppointments = new List<Appointment>();
var localAppointments = new List<Appointment>();
var appointment01 = new Appointment( 1, new DateTime( 2012, 12, 24, 17, 30, 00 ),
new DateTime( 2012, 12, 24, 17, 45, 00 ) );
var appointment02 = new Appointment( 2, new DateTime( 2012, 12, 24, 17, 30, 00 ),
new DateTime( 2012, 12, 24, 17, 45, 00 ) );
onlineAppointments.Add( appointment01 );
localAppointments.Add( appointment02 );
var comparer = new AppointmentEqualityComparer<Appointment>();
var diffOnlineOffline = onlineAppointments.Except( localAppointments, comparer ).ToList();
diffOnlineOffline
仅显示第一个约会。这导致得出结论:getAppointmentStart
和getAppointmentEnd
方法返回的值不是构造函数中使用的实际日期。
答案 2 :(得分:0)
您需要在Appointment类中实现IEqualityComparer