2

オンラインデータベースとローカルデータベースの予定を同期する必要があります。これが私のコードです。

        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は空ではありませんが、両方のリストに同じ予定が含まれているため、空である必要があります。

何か案が?

4

3 に答える 3

2

メソッドGetHashCodeは、平等に使用されるプロパティを使用する必要があります。現時点では、同等と見なしたいオブジェクトはおそらく同じハッシュコードを持っていません。

次のようなものを使用できます。

public int GetHashCode(T obj)
{
    return 41 * (41 * (41 * (41 + obj.getAppointmentStart().GetHashCode())) 
    + obj.getAppointmentEnd().GetHashCode());
}
于 2012-12-08T17:57:05.090 に答える
1

問題はgetAppointmentStartgetAppointmentEndメソッドにあると思います。これは、同じ等式比較器を使用したコードの簡潔なバージョンですが、期待どおりに機能するプロパティを使用しています。

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メソッドがコンストラクターで使用されている実際の日付以外の値を返しているという結論に至り ます。

于 2012-12-08T17:52:30.410 に答える
0

AppointmentクラスにIEqualityComparerを実装する必要があります

于 2012-12-08T17:53:11.080 に答える