Ejemplo n.º 1
0
        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();
        }