Уже есть метод расширения, который сделает это.Просто добавьте это в конец вашего существующего запроса:
.ToDictionary(x => x.FileHash, x => x.Files);
Однако: использование Encoding.UTF8.GetString
для преобразования произвольных двоичных данных в строку - действительно плохая идея.Вместо этого используйте Convert.ToBase64String
.Хеш не строка в кодировке UTF-8, поэтому не рассматривайте ее как единое целое.
Вы также группируете по хешу дважды, что, как я подозреваю, на самом деле не то, что выхочу сделать.
Либо удалите предыдущие вызовы GroupBy
и используйте вместо него Lookup
:
var query = Directory.GetFiles(searchFolder, "*.*")
.Select(f => new {
FileName = f,
FileHash = Convert.ToBase64String(
new SHA1Managed().ComputeHash(...))
})
.ToLookup(x => x.FileHash, x => x.FileName);
Это даст вам Lookup<string, string>
, который в основном представляет собой файлысгруппированы по хешу.
Еще одна вещь, на которую следует обратить внимание: я подозреваю, что вы оставите файловые потоки открытыми с помощью этого метода.Я предлагаю вам написать небольшой отдельный метод для вычисления хэша файла на основе его имени, но убедитесь, что вы закрываете поток (с помощью оператора using
обычным способом).Это также в конечном итоге сделает ваш запрос более простым - что-то вроде:
var query = Directory.GetFiles(searchFolder)
.ToLookup(x => ComputeHash(x));
Трудно упростить его гораздо дальше, чем это:)