Переопределение ToString в собственном классе

217
12 декабря 2017, 16:48

Есть класс Polynom. В нем многочлен задается массивом коэффициентов. нужно вывести многочлен в консоль в виде, например, 3x^4+2x^3+1, используя String.format.

Класс выглядит так:

public class Polynom
{
    public int[] coefficients;
    public int polynomDegree;
    public string x;
    public int[] powers;
    // задать полином при помощи коэффициентов
    public Polynom(params int[] coefficients)
    {
        this.coefficients = coefficients;
    }

    //свойство степени многочлена
    public int PolynomDegree
    {
        get
        {
            for (int i = 0; i < coefficients.Length; i++)
            { powers[i] = i; }
            return powers.Length - 1;
        }
    }


    public override string ToString()
    {
        object[] args = new object[] { this.coefficients, this.powers };
        return string.Format("Polynom  {0}" + "x^{1}", string.Join("" + "x^", args));
    }

    //индексатор на чтение и запись
    public int this[int index]
    {
        set
        {
            this.coefficients[index] = value;
        }
        get
        {
            return this.coefficients[index];
        }
    }
Answer 1

Так просто через string.Format() здесь не получится, он не работает с переменным количеством аргументов.

Мой вариант с использованием StringBuilder:

class Polynom
{
    //int[] coefficients = new int[] { 1, 2, -6, 2, 3 };
    ...
    public override string ToString()
    {
        var sb = new StringBuilder();
        for (int i = coefficients.Length - 1; i >= 0; --i)
        {
            if (coefficients[i] == 0) continue;
            if (coefficients[i] > 0 && sb.Length > 0) sb.Append('+');
            sb.Append(coefficients[i]);
            if (i > 0) sb.Append('x');
            if (i > 1) sb.Append('^').Append(i);
        }
        return sb.ToString();
    }
}

Учтено:
1. Члены с нулевым коэффициентом не выводятся.
2. Корректно отображается знак +/- перед коэффициентом, если старший коэффициент положительный — + перед ним не отображается.
3. Не отображается степень при x^1.
4. Не отображается x^0 при свободном члене.

Пример вывода: 3x^4+2x^3-6x^2+2x+1

Answer 2

Переопределяете метод ToString(). Берете массив коэффициентов, собираете из них строки вида cx^i и разворачиваете так, чтобы старший коэффициент шел первым. Добавляете костыль для 0-й степени. Примерно так:

class Polynom
{
    int[] coefficients = new int[] { 1, 0, 0, 2, 3 };
    public override string ToString()
    {
        var nonZero = String.Join(" + ", 
            coefficients
                .Where(c => c != 0)
                .Select((i, c) =>  $"{c}x^{i + 1}")
                .Skip(1) // skip x^0
                .Reverse());
        return nonZero + (coefficients[0] != 0 ? " + " + coefficients[0] : "");
    }
}
READ ALSO
Конвертирование строки в дату

Конвертирование строки в дату

Есть проблемаВ файле я храню дату и в зависимости от настроек CultureInfo формат хранения в виде строки отличен

460
Анимация пути. Polygon. WPF

Анимация пути. Polygon. WPF

Имеется ListView с переопределенным ItemTemplate

265
Как починить рандом? [дубликат]

Как починить рандом? [дубликат]

На данный вопрос уже ответили:

197
Как добавить иконку в treeviewitem

Как добавить иконку в treeviewitem

На форме есть treeviewВ который узлы добавляю программно

234