private string FormatCore(string format, NdArray<T> array, IFormatProvider formatProvider, string typeName) { var cfg = string.IsNullOrEmpty(format) ? NdArrayFormatConfig.GetDefault(array.Rank) : new NdArrayFormatConfig(format); NdArray<string> texts; { string elementToString(T x) => x is IFormattable y ? y.ToString(cfg.ElementFormat, formatProvider) : x?.ToString() ?? ""; var tmp = array.AsEnumerable().Select(elementToString).ToArray(); var maxlen = tmp.Select(x => x.Length).Max(); for(var i = 0 ; i < tmp.Length ; ++i) tmp[i] = tmp[i].PadLeft(maxlen, ' '); texts = NdArray.Create(tmp, array.Shape); } var baseIndent = new string(' ', typeName.Length + 1); var result = new StringBuilder(); switch(cfg.Options) { case FormatOption.OutputsElementType: result.AppendLine($"{typeName}(Type={typeof(T).Name},"); result.Append(baseIndent); break; case FormatOption.OutputsShapeSummary: result.AppendLine($"{typeName}(Shape={array.Shape},"); result.Append(baseIndent); break; case FormatOption.OutputsElementType | FormatOption.OutputsShapeSummary: result.AppendLine($"{typeName}(Type={typeof(T).Name}, Shape={array.Shape},"); result.Append(baseIndent); break; default: result.Append($"{typeName}("); break; } var contentLines = ToStringRect(texts, cfg.GetFilledAxesLimits(array.Rank), cfg.LineWidth - typeName.Length - 1); var content = string.Join("\r\n" + baseIndent, contentLines); result.Append(content); result.Append(')'); return result.ToString(); }