public ValidationErrors Validate() { var validationErrors = new ValidationErrors(); validationErrors.AddErrorsFor(this.SourceFolder.UUID, this.SourceFolder.Validate()); foreach (var target in this.TargetFolders) { validationErrors.AddErrorsFor(target.UUID, target.Validate()); if (target.IntersectsWith(this.SourceFolder)) { validationErrors.AddErrorFor(target.UUID, "Selected folder intersects with source folder"); } if (this.TargetFolders.Any(it => it.UUID != target.UUID && it.IntersectsWith(target))) { validationErrors.AddErrorFor(target.UUID, "Specified folder is a subpath of one of the added folders"); } } var duplicateIds = this.TargetFolders .GroupBy(it => it.FolderPath.ToLowerInvariant()) .SelectMany(grp => grp.Skip(1)) .Select(it => it.UUID); foreach (var duplicateId in duplicateIds) { validationErrors.AddErrorFor(duplicateId, "Folder duplicated"); } return(validationErrors); }