カスタム差分比較に基づいて、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);