public FilesGroup(FilesGroup group, Progress <OperationStatus> progress)
 {
     //foreach (var file in group)
     //    _files.Add(file);
     _files.AddRange(group);
     _progress = progress;
 }
Beispiel #2
0
 public DataModel()
 {
     Settings.Restore();
     FileSelectionOptions.Init(_settings);
     _progress             = new Progress <OperationStatus>(ReportStatus);
     _duplicatesCollection = new GroupedFilesCollection(_progress);
     _filesCollection      = new FilesGroup(_progress);
 }
        public FilesGroup Clone()
        {
            var newGroup = new FilesGroup(_progress);

            foreach (File file in _files)
            {
                newGroup.Add(file);
            }

            return(newGroup);
        }
        /// <summary>
        /// Split group to smoll groups with equal value of given attribute
        /// Выполняем сортировку группы по заданному атрибуту файла
        /// Сравниваем файлы в группе по заданному атрибуту попарно первый со вторым второй с третьим и тд
        /// и при равенстве знвчений заданного атрибута добавляем файлы в новую группу
        /// при первом несовпадении файлов считаем формирование группы файлов совпадающих по заданному атрибуту
        /// завершенным.
        /// Если количество файлов в новой группе больше 1, новую группу добавляем в новый список групп
        /// </summary>
        /// <param name="attribute"></param>
        /// <param name="status"></param>
        /// <param name="cancelToken"></param>
        /// <returns></returns>
        public async Task <List <FilesGroup> > SplitByAttribute(GroupingAttribute attribute,
                                                                CancellationToken cancelToken, OperationStatus status)
        {
            Debug.Assert(this.Count >= 2, "SplitByAttributeMethod called on group with less then two files");

            IProgress <OperationStatus> progress = _progress;

            DataModel.SearchStatus oldStatusId = status.Id;

            status.Id = DataModel.SearchStatus.Sorting;
            progress.Report(status);
            await this.SortByAttribute(0, this.Count - 1, attribute.Attribute);

            status.Id = oldStatusId;
            var newGroupsCollection = new List <FilesGroup>();

            var newgroup = new FilesGroup(_progress);

            newgroup.Add(_files[0]);
            ++status.HandledItems;
            for (int i = 1; i < this.Count; i++)
            {
                int compareResult = await _files[i - 1].CompareTo(_files[i], attribute.Attribute);
                if (compareResult != 0)
                {
                    if (newgroup.Count > 1)
                    {
                        newGroupsCollection.Add(newgroup);
                    }
                    newgroup = new FilesGroup(_progress);
                }
                newgroup.Add(_files[i]);

                cancelToken.ThrowIfCancellationRequested();
                ++status.HandledItems;
                progress.Report(status);
            }

            if (newgroup.Count > 1)
            {
                newGroupsCollection.Add(newgroup);
            }
            return(newGroupsCollection);
        }