2

私が以前に尋ねた質問を参照してください: 多くのオブジェクトを含む 2 つのリストを比較する

IEqualityComparer インターフェイスを実装することで、比較がいかに高速に行われるかを見るのは印象的です。

他の質問で述べたように、この比較は、ソース フォルダーを宛先フォルダーにバックアップするのに役立ちます。フォルダーに同期したいので、ファイルの日付を比較する必要があります。私が次のようなことをするときはいつでも:

public class MyFileComparer2 : IEqualityComparer<MyFile>
{

    public bool Equals(MyFile s, MyFile d)
    {
        return
            s.compareName.Equals(d.compareName) &&
            s.size == d.size &&
            s.deepness == d.deepness &&
            s.dateModified.Date <= d.dateModified.Date;  // This line does not work. 
            // I also tried comparing the strings by converting it to a string and it does
            // not work. It does not give me an error but it does not seem to include the files
            // where s.dateModified.Date < d.dateModified.Date

    }

    public int GetHashCode(MyFile a)
    {
        int rt = (a.compareName.GetHashCode() * 251 + a.size.GetHashCode() * 251 + a.deepness.GetHashCode() + a.dateModified.Date.GetHashCode());

        return rt;

    }
}

以上の記号を使用して同様のことができればいいのですが。tick プロパティも使用してみましたが、機能しません。たぶん私は何か間違ったことをしています。このインターフェイスを実装する等号より小さいものを比較することはできないと思います。さらに、このクラスの仕組みがわかりません。リスト全体をどれだけ速く反復処理するかが印象的であることは知っています。

4

4 に答える 4

4

あなたのIEqualityComparer.Equals方法は対称的ではないため、アプローチ全体に根本的な欠陥があります。これは 、より小さい演算子の使用方法が原因で、Equals(file1, file2)等しくないことを意味します。Equals(file2, file1)

ドキュメント:

明確に述べています:

実装者への注意事項

Equals メソッドは、再帰的、対称的、および推移的です。つまり、オブジェクトをそれ自体と比較するために使用された場合は true を返します。y と x が true の場合、2 つのオブジェクト x と y が true です。x と y が true で、y と z も true の場合、2 つのオブジェクト x と z が true です。

Equals メソッドが 2 つのオブジェクト x と y に対して true を返す場合、x の GetHashCode メソッドによって返される値が y に対して返される値と等しくなければならないことを保証する実装が必要です。

代わりに、IComparableインターフェースを使用するかIEqualityComparer、日付比較と組み合わせて使用​​する必要があります。そうしないと、しばらくはうまくいくように見えますが、後で後悔することになります。

于 2011-05-16T04:50:13.043 に答える
3

一方の DateTime が他方よりも小さい場合は DateTime オブジェクトが異なるため、オブジェクトsdに対して異なるハッシュコードが取得され、Equals メソッドは呼び出されません。日付の比較を機能させるには、GetHashCode メソッドから日付部分を削除する必要があります。

public int GetHashCode(MyFile a)
{
    int rt = ((a.compareName.GetHashCode() * 251 + a.size.GetHashCode())
                          * 251 + a.deepness.GetHashCode()) *251;

    return rt;

}
于 2011-05-16T03:55:00.877 に答える
0

時間も必要だったので日付部分を変更したので、代わりに ticks プロパティを使用します。dateModified ハッシュ コードを削除したところ、うまく機能しました。これが私のプログラムの修正方法です。日付の比較に問題があったため、Ticks プロパティを使用しました。

public class MyFileComparer2 : IEqualityComparer<MyFile>
{

    public bool Equals(MyFile s, MyFile d)
    {
        return
            s.compareName.Equals(d.compareName) &&
            s.size == d.size &&
            s.deepness == d.deepness &&
            //s.dateModified.Date <= d.dateModified.Date &&
            s.dateModified.Ticks >= d.dateModified.Ticks
            ;  

    }

    public int GetHashCode(MyFile a)
    {
        int rt = (((a.compareName.GetHashCode() * 251)
                + a.size.GetHashCode() * 251)
                + a.deepness.GetHashCode() * 251)
                //+ a.dateModified.Ticks.GetHashCode();                       
                ;

        return rt;

    }
}

このハッシュコード関数がどのように機能するかはまだわかりません。素晴らしいことは、それがうまく機能することです。

于 2011-05-16T04:27:46.230 に答える
0

GetHashCode に問題があります:

public int GetHashCode(MyFile a)
{
    int rt = (((a.compareName.GetHashCode() * 251) 
           + a.size.GetHashCode() * 251)
           + a.deepness.GetHashCode() *251) 
           + a.dateModified.Date.GetHashCode();

    return rt;

}
于 2011-05-16T03:30:45.260 に答える