Как мне создать свой собственный формат ToString ()? - PullRequest
15 голосов
/ 08 февраля 2010

Я хотел бы указать формат ToString, но я не уверен, что лучше всего справиться с этим.

Например, если у меня есть следующие спецификаторы

  • EE = оборудование
  • ED = описание оборудования
  • EI = ID оборудования

так что если бы я использовал ToString как таковой:

eqp.ToString("EE-EI (ED)")

вывод может быть:

"CAT994-61 (Front end loader)"

Будет ли лучший способ поиска подстрок и замены токена? У кого-нибудь есть пример сделать это?

В настоящее время я делаю последовательный string.Replace, который прекрасно работает.

public class Equipment
{
    // (other class code)

    public string ToString(string format)
    {
        string output = format;
        output = output.Replace("EE", _EquipID);
        output = output.Replace("ED", _EquipDescription);
        output = output.Replace("DI", _DepartID);
        return output;
    }

    public override string ToString()
    {
        return _EquipID;
    }
}

Ответы [ 6 ]

15 голосов
/ 08 февраля 2010

Комбинируя формат строки и перегружая ToString, вы можете сделать это:

public override string ToString(string myFormat)
{
    myFormat = myFormat.Replace("EE", "{0}");
    myFormat = myFormat.Replace("EI", "{1}");
    myFormat = myFormat.Replace("ED", "{2}");
    return String.Format(myFormat, this.equipment, this.description, this.id);
}

Вы также можете использовать регулярные выражения для улучшения функций Replace.


Это можно использовать следующим образом:

oProd.ToString("EE,ED,EI");
oProd.ToString("EE-ED (EI)"); // change order
oProd.ToString("ED-EE,EE,EE (EI)"); // multiple times
oProd.ToString("ED:EI"); // have some missing
etc

String.Format дает вам возможность располагать переменные формата любым образом, иметь их несколько раз или удалять некоторые.

6 голосов
/ 08 февраля 2010

Первое переопределение ToString ()

Тогда, если вы хотите, чтобы он был динамическим, вам нужно будет анализировать строку формата по токену за раз и добавлять соответствующую строку в вашу выходную строку. Использование спецификаторов однобуквенного формата сделало бы это немного проще, так как вы могли бы анализировать символ за раз. Если это специальный символ, вы выводите соответствующие данные, иначе выводите символ.

Так что-то вроде этого

public override string ToString(string format)
{
  StringBuilder s = new StringBuilder();

  foreach (char c in format)
  {
    switch (c)
    {
      case 'E':
        s.Append(EquipID);
        break;
      case 'D':
        s.Append(EquipDesc);
        break;
      case 'I':
        s.Append(DepartID);
        break;
      default:
        s.Append(c);
        break;
    }
  }

  return s.ToString();
}

Это имеет сравнительно небольшое преимущество, делая это за один проход, что более эффективно, чем множественные вызовы замены строки.

2 голосов
/ 08 февраля 2010
String.Format("{0:foo}", object);

В конечном итоге передаст "foo" в object.ToString(string format);, поэтому имеет смысл разработать аргументы, которые ваш метод ToString(string format) принимает во внимание. В вашем примере

String.Format("{0:EI - EE}", object);

приведет к тому, что "EI - EE" будет передан методу ToString объекта, так что это может работать, как вы описываете, но может иметь смысл ограничить формат одним представлением за раз, например,

String.Format("{0:EI} - {0:EE}", object);

будет способом получить "CAT994-61" в качестве вывода, и ваш метод ToString () может быть проще

public override string ToString(string myFormat)
{
    string str = null;
    switch (myformat.ToLower())
    {
       case "ee": str = this.equipment; break;
       case "ei": str = this.description; break;
       case "ed": str = this.id; break;
       default: str = this.ToString(); break;
    }
    return str;
}

Если вы сократите спецификаторы формата до отдельных букв, это будет более соответствовать тому, как другие объекты обрабатывают форматы ToString.

0 голосов
/ 08 февраля 2010

Формат звучит как хорошее решение.
Возможно (несколько) хороших регулярных выражений, чтобы разрезать вашу входную переменную на группы.

Я бы попытался использовать как можно больше существующих форматов, если вы можете:
http://blog.stevex.net/string-formatting-in-csharp/

0 голосов
/ 08 февраля 2010

Вам просто нужно перегрузить функцию ToString в вашем объекте, как

public override string ToString()
{
    /* some code handling here */
    return ""; //your own formated string
}
0 голосов
/ 08 февраля 2010

Использование String.Format.

String.Format("{0}-{1} ({2})", "CAT994", 61, "Front end loader");

дает ожидаемый результат.

...