private async Task MatchPackageFileAsync(VarPackage package, VarPackageFile packageFile, ConcurrentDictionary <string, List <FreeFile> > freeFilesSet) { if (!freeFilesSet.TryGetValue(packageFile.FilenameLower, out var matchingFreeFiles)) { return; } await Task.WhenAll(matchingFreeFiles.SelectMany(m => m.SelfAndChildren()).Where(m => m.Hash == null).Select(async m => await ComputeHashAsync(m))); var matchedFreeFiles = matchingFreeFiles .Where(ff => ff.Hash == packageFile.Hash) .Where(ff => { if (ff.Children == null || ff.Children.Count == 0) { return(true); } foreach (var child in ff.Children) { if (!package.Files.Any(pf => pf.FilenameLower == child.FilenameLower && pf.Hash == child.Hash)) { return(false); } } return(true); }) .ToList(); if (matchedFreeFiles.Count == 0) { return; } _matches.Add(new FreeFilePackageMatch( package, packageFile, matchedFreeFiles)); }
private async Task MatchPackageAsync(IProgress <ProgressInfo> reporter, VarPackage package, int packagesCount, ConcurrentDictionary <string, List <FreeFile> > freeFilesSet) { reporter.Report(new ProgressInfo(Interlocked.Increment(ref _processed), packagesCount, package.Name.Filename)); await Task.WhenAll(package.Files.Select(async f => await MatchPackageFileAsync(package, f, freeFilesSet))); }