private IEnumerable <UserNeed> ParseBlocks(IEnumerable <IReadOnlyList <string> > _textBlocks) { List <UserNeed> userNeeds = new List <UserNeed>(); List <(Requirement Requirement, string ParentLabel)> requirementsDetails = new List <(Requirement, string)>(); List <(Specification Specification, string ParentLabel)> specificationsDetails = new List <(Specification, string)>(); foreach (IReadOnlyList <string> textBlock in _textBlocks) { const string parentPrefix = "#### "; if (TryGetItemDetails(textBlock, $@"^### {"UN"}-[0-9]+$", parentPrefix, out (int Id, string Description, string ParentLabel)userNeedDetails)) { UserNeed userNeed = new UserNeed(userNeedDetails.Id, userNeedDetails.Description); userNeeds.Add(userNeed); } else if (TryGetItemDetails(textBlock, $@"^### {"REQ"}-[0-9]+$", parentPrefix, out (int Id, string Description, string ParentLabel)requirementDetails)) { Requirement requirement = new Requirement(requirementDetails.Id, requirementDetails.Description); requirementsDetails.Add((requirement, requirementDetails.ParentLabel)); } else if (TryGetItemDetails(textBlock, $@"^### {"SPEC"}-[0-9]+$", parentPrefix, out (int Id, string Description, string ParentLabel)specificationDetails)) { Specification specification = new Specification(specificationDetails.Id, specificationDetails.Description); specificationsDetails.Add((specification, specificationDetails.ParentLabel)); } else { ThrowError(-1, $"Failed to parse text block!"); } } //associate items Requirement[] requirements = requirementsDetails.Select(_requirement => _requirement.Requirement).ToArray(); foreach ((Specification specification, string parentLabel) in specificationsDetails) { Requirement requirement = requirements.FirstOrDefault(_requirement => _requirement.Label == parentLabel); requirement?.AddSpecification(specification); } foreach ((Requirement requirement, string parentLabel) in requirementsDetails) { UserNeed userNeed = userNeeds.FirstOrDefault(_userNeed => _userNeed.Label == parentLabel); userNeed?.AddRequirement(requirement); } return(userNeeds); }
private bool Equals(UserNeed _other) { return(base.Equals(_other) && m_requirements.SequenceEqual(_other.m_requirements)); }