private List <List <MatchResult> > GetDuplicatesFromGroup(IReadOnlyCollection <IComparableFile> fileGroup, SearchContext context, CancellationToken cancellationToken) { var duplicates = new List <List <MatchResult> >(); foreach (var fileFromGroup in fileGroup) { try { if (ContainsFile(duplicates, fileFromGroup)) { continue; } DuplicatesSearchProgress?.Invoke(this, new DuplicatesSearchProgressEventArgs(fileFromGroup.FileData.FullName, null)); var fileFromGroupDuplicates = GetFileDuplicates(fileFromGroup, fileGroup, context, cancellationToken); if (fileFromGroupDuplicates.Count != 0) { duplicates.Add(fileFromGroupDuplicates); } } finally { context.CurrentFileIndex++; } } return(duplicates); }
private void GetDuplicatesFromCandidates(IReadOnlyCollection <IComparableFile[]> duplicateCandidates, IFileComparerConfig comparerConfig, CancellationToken cancellationToken) { var context = new SearchContext { ComparerConfig = comparerConfig, TotalFilesCount = duplicateCandidates.AsParallel().Sum(group => group.Length) }; foreach (var duplicateCandidateGroup in duplicateCandidates) { var groupDuplicates = GetDuplicatesFromGroup(duplicateCandidateGroup, context, cancellationToken); if (groupDuplicates.Count == 0) { continue; } var(duplicatesCount, duplicatesSize) = GetGroupDuplicatedCountAndSize(groupDuplicates); context.DuplicateGroupsCount += groupDuplicates.Count; context.DuplicateFilesCount += duplicatesCount; context.DuplicatedTotalSize += duplicatesSize; DuplicatesSearchProgress?.Invoke(this, new DuplicatesSearchProgressEventArgs(null, context)); foreach (var group in groupDuplicates) { DuplicatesGroupFound?.Invoke(this, new DuplicatesGroupFoundEventArgs(group)); } } }