0

カスタム差分比較に基づいて、2 つのディレクトリの差分を取得したいと考えています。周りを見回して、要件に合わせて変更したこのコードを見つけましたが、どういうわけか間違った結果が返されました。

1 つは名前で、もう 1 つはサイズで、2 つの FileNamecomparions が必要です

class FileNameCompare : System.Collections.Generic.IEqualityComparer<System.IO.FileInfo>
{
    public FileNameCompare() { }

    public bool Equals(System.IO.FileInfo file1, System.IO.FileInfo file2)
    {
        return (file1.Name == file2.Name);
    }

    public int GetHashCode(System.IO.FileInfo fileInfo)
    {
        string fileString = String.Format("{0}{1}", fileInfo.Name, fileInfo.Length);
        return fileString.GetHashCode();
    }
}

そして私のコードでは、私は呼んでいます

    //Compare files
        FileNameCompare fileNameCompare = new FileNameCompare();


        bool areIdentical = baseList.SequenceEqual(compareList, fileNameCompare);

        IEnumerable<FileInfo> diff = (from file in baseList
                                                      select file).Except(compareList, fileNameCompare);

タイプ IEnumerable baseList の baselist および comparelist

今、ファイル名が同じでサイズが異なる2つのディレクトリがある場合、areidenticalはtrueになりますが、diffにはベースリストに1つのファイルがまだあります。

私が間違っているのは何ですか?

同じディレクトリで、名前とサイズの両方の比較を実行する必要があります。名前とサイズが異なるファイルを正確に確認する必要があります。そのため、比較を分離しました。

編集:

サイズが異なる(両方のディレクトリに存在する)ファイルを見つける必要があったため、Ramokuのヒントに基づいて、これが私が行ったことです。

        //Get common directories between baselist and comparelist
        IEnumerable<FileInfo> commonList = (from file in baseList
                                            select file).Intersect(compareList, fileNameCompare);

        IEnumerable<FileInfo> diffInListBySize = (from file in commonList
                                                  select file).Except(compareList, fileSizeCompare);
4

4 に答える 4

1

これがあなたの言いたいことですか、それとも何か足りないのですか?

class FileNameCompare : System.Collections.Generic.IEqualityComparer<System.IO.FileInfo>
{
    public FileNameCompare() { }

    public bool Equals(System.IO.FileInfo file1, System.IO.FileInfo file2)
    {
        return file1.Name == file2.Name && file1.Length == file2.Length;
    }

    public int GetHashCode(System.IO.FileInfo fileInfo)
    {
        string fileString = String.Format("{0}{1}", fileInfo.Name, fileInfo.Length);
        return fileString.GetHashCode();
    }
}
于 2013-09-12T18:03:29.943 に答える