我是Linq和擴展方法的新手,我想我現在還不能掌握所有擴展方法的用法。如何使用linq獲取列表<byte[]>與具有byte []屬性的匿名類型的區別?
我正在讀一堆文件,並且在讀完一個文件之後,我將文件的哈希值存儲到數據庫中(文件名更改,並且它們四處移動)。定期地,我想檢查一個目錄並根據它們的散列值讀取我還沒有的文件。所以,我添加了一個擴展方法來獲取文件的SHA256哈希:
public static byte[] GetSHA256Hash(this FileInfo file)
{
using (FileStream fs = new FileStream(file.FullName, FileMode.Open))
{
using (SHA256 hasher = new SHA256Managed())
{
return hasher.ComputeHash(fs);
}
}
}
所以,我查詢我的數據庫,並得到我已經閱讀散列的列表,檢查目錄中的所有文件,然後我想知道哪些文件不在我讀過的文件列表中。我認爲filesRead中的byte []與我的擴展方法返回的哈希相匹配。
//Get list of hashes that have been read
List<byte[]> filesRead = GetReadFiles();
// I also need the file name, directory, etc so I can pass
// that info on to the next method that actually reads the file
var filesOnDisk = (new DirectoryInfo("c:\\dirtocheck").GetFiles("*"))
.Where(file => file.LastWriteTime > new DateTime(2009, 01, 01))
.Select(fileinfo => new { File = fileinfo, Hash = fileinfo.GetSHA256Hash() });
var filesToProcess = filesOnDisk
.Where(file => !filesRead.Contains(file.Hash))
.Select(fileinfo => fileinfo.File).ToList<FileInfo>();
我的問題是沒有任何文件被過濾掉。我已經將filesRead中的哈希與filesToProcess中的文件哈希進行了比較,並且它們相匹配。我只是不明白。
即使它們包含相同的字節,兩個不同的字節數組引用永遠不會比較爲相等。也許你應該使用SequenceEquals擴展方法來比較兩個字節數組? – 2009-05-28 15:58:18