/// <summary> Constructor. </summary> /// <param name="targetLengths"> List of lengths of the targets. </param> /// <param name="sourceValues"> A variable-length parameters list containing source values. </param> public StringModel(IEnumerable <int> targetLengths, params string[] sourceValues) { TargetLengths = targetLengths.ToList(); TargetStrings = TargetLengths.Select(l => string.Empty).ToList(); var sb = new StringBuilder(); foreach (var value in sourceValues) { if (!string.IsNullOrWhiteSpace(value)) { sb.AppendLine(value); } } if (!FitDefault(sourceValues)) { if (!FitByWord(sourceValues)) { if (!FitUgly(sourceValues)) { throw new NotImplementedException("CustomerString was too long to handle..."); } } } }
/// <summary> Fit by word. </summary> /// <param name="lines"> The lines. </param> /// <returns> True if it succeeds, false if it fails. </returns> private bool FitByWord(string[] lines) { var words = string.Join(" ", lines.Where(line => !string.IsNullOrWhiteSpace(line))).Split(' '); var internalLines = TargetLengths.Select(l => string.Empty).ToList(); var lineCounter = 0; var charsLeft = TargetLengths[lineCounter]; foreach (var word in words) { if (charsLeft >= word.Length + 1) { internalLines[lineCounter] += $"{word} "; charsLeft = TargetLengths[lineCounter] - internalLines[lineCounter].Length; } else { if (lineCounter < TargetLengths.Count - 1) // lines left { lineCounter++; charsLeft = TargetLengths[lineCounter] - internalLines[lineCounter].Length; if (charsLeft >= word.Length + 1) { internalLines[lineCounter] += $"{word} "; charsLeft = TargetLengths[lineCounter] - internalLines[lineCounter].Length; } else { return(false); } } else { return(false); } } } TargetStrings = internalLines; return(true); }