2009-05-28 6 views
1

Je suis nouveau à Linq et les méthodes d'extension et je suppose que je ne peux pas encore comprendre l'utilisation de toutes les méthodes d'extension pour le moment. Je lis un tas de fichiers, et après avoir été lu, je stocke la valeur de hachage du fichier dans une base de données (les noms de fichiers changent, et ils sont déplacés). Périodiquement, je veux vérifier un répertoire et lire tous les fichiers que je n'ai pas déjà, en fonction de leur valeur de hachage. Donc, j'ai ajouté une méthode d'extension pour obtenir le hachage SHA256 d'un fichier:Comment utiliser linq pour obtenir la différence d'une liste <byte[]> et d'un type anonyme avec une propriété byte []?

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); 
     } 
    } 
} 

, je QUERY ma base de données et obtenir une liste de hash que je l'ai déjà lu, vérifiez le répertoire pour tous les fichiers et je Je veux savoir lesquels n'apparaissent pas dans la liste des fichiers que j'ai lus. Je suis certain que l'octet [] dans filesRead correspond aux hashes renvoyés par ma méthode d'extension.

//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>(); 

Mon problème est qu'aucun de ces fichiers n'est filtré. J'ai comparé les hachages dans les fichiers Read aux hachages de fichiers dans filesToProcess et ils correspondent. Je ne comprends pas.

+3

Deux références de tableaux d'octets différentes ne se comparent jamais comme égales même si elles contiennent les mêmes octets. Peut-être que vous devriez utiliser la méthode d'extension SequenceEquals pour comparer les deux tableaux d'octets? –

Répondre

1

Ouais ce que Eric a dit. filesRead.Contains ne va pas faire ce que vous attendez. Essayez d'introduire une nouvelle structure ou classe implements equality pour que le contenu ne fasse pas de comparaison de réfrence et fasse plutôt une comparaison de valeurs.

+0

Arg! J'étais aveuglé par le LINQ! – scottm

Questions connexes