public bool TryReadAndParselines <T>( string filePath, Dictionary <string, string> attributeMappings, out List <AdProcurement> valueList, out Dictionary <int, string> headerInOrder, out Dictionary <string, int> dataLinePropsInOrder, out string errors) where T : IEntity { var errorMessages = new StringBuilder(); var orderedHeaderAttributes = new Dictionary <int, string>(); var orderedLineProperties = new Dictionary <string, int>(); var isValidationsPassed = true; var adProcurementList = new List <AdProcurement>(); var depth = 0; var result = new List <IEntity>(); var headerColumnDictionary = new Dictionary <int, string>(); try { foreach (var line in _fileService.ReadLines(filePath)) { if (line.StartsWith("****") || line.StartsWith("#") || string.IsNullOrEmpty(line)) { continue; } var rowColumnDictionary = new Dictionary <int, string>(); if (depth == 0) { headerColumnDictionary = _lineParser.TabSeparatedParser(line); //check the header is the correct format and extract missing header attribute var missingHeaderAttributes = attributeMappings.Values.Except(headerColumnDictionary.Values); if (missingHeaderAttributes.ToList().Count != 0) { errorMessages.Append( $"Following header attributes are missing: {string.Join(", ", missingHeaderAttributes)}"); break; } orderedHeaderAttributes = headerColumnDictionary; //extract line data property order foreach (var mapping in headerColumnDictionary) { orderedLineProperties[attributeMappings.FirstOrDefault(x => x.Value == mapping.Value).Key] = mapping.Key; } } else { rowColumnDictionary = _lineParser.TabSeparatedParser(line); var entity = _deserializeRowData.Deserialize(headerColumnDictionary, rowColumnDictionary, attributeMappings); AdProcurement value; var validationErrors = string.Empty; AdProcurement.For(entity, out value, out validationErrors); if (value != null && string.IsNullOrEmpty(validationErrors)) { adProcurementList.Add(value); } else { errorMessages.Append($"Row Number {depth} : \n {validationErrors} \n"); isValidationsPassed = false; } } depth++; } } catch (Exception exx) { errorMessages.Append(exx.Message); } valueList = adProcurementList; headerInOrder = orderedHeaderAttributes; dataLinePropsInOrder = orderedLineProperties; errors = errorMessages.ToString(); return(isValidationsPassed); }