2009-05-28 58 views
1

我是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中的文件哈希進行了比較,並且它們相匹配。我只是不明白。

+3

即使它們包含相同的字節,兩個不同的字節數組引用永遠不會比較爲相等。也許你應該使用SequenceEquals擴展方法來比較兩個字節數組? – 2009-05-28 15:58:18

回答

1

是的,埃裏克說。 filesRead.Contains不會做你期望的。嘗試引入一個新的結構或類,implements equality因此包含不做參考比較,而是進行值比較。

+0

Arg!我被LINQ蒙上了一層陰影! – scottm 2009-05-28 16:25:20

相關問題