Как я создаю свой собственный ToString () формат?

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

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

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

так, чтобы, если я использовал 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;
    }
}
15
задан Michael 25 May 2017 в 14:52
поделиться

6 ответов

Комбинируя строковый формат и перегрузив 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 дает вам гибкость, чтобы позиционировать переменные формата любым способом, иметь их несколько раз или отбрасывать некоторые.

15
ответ дан 1 December 2019 в 03:24
поделиться

Сначала переопределите ToString ()

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

Что-то вроде этого

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();
}

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

6
ответ дан 1 December 2019 в 03:24
поделиться

То, что , казалось, исправило, так это отключение Nagling в ServicePoint, связанной с этим URI, и отправка запроса как HTTP 1,0 (ни один из них сам не исправляет его):

var servicePoint = ServicePointManager.FindServicePoint(uri.Uri);
servicePoint.UseNagleAlgorithm = false;

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

Интересно, как трудно будет написать дефрагментацию прокси...

-121--3732539-

Это объектно-ориентированное программирование и терминология UML, не специфичная для Java. Существует три случая, о которых вы должны знать:

  1. Дом является зданием (наследованием);
  2. Дом имеет Комнатами (составом);
  3. Дом имеет жильца (агрегацией).

Различие между (2) и (3) является тонким, но важным для дифференциации. Вместе они являются формами ассоциации . Какая разница? Композиция подразумевает, что детский объект не может жить вне контекста родителя (разрушить дом и комнаты исчезают), в то время как агрегирование подразумевает, что ребенок может существовать сам по себе (разрушить дом и жильца уходит в другое место).

-121--963958-
String.Format("{0:foo}", object);

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

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.

2
ответ дан 1 December 2019 в 03:24
поделиться

Используйте String.Format.

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

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

0
ответ дан 1 December 2019 в 03:24
поделиться

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

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

0
ответ дан 1 December 2019 в 03:24
поделиться

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

public override string ToString()
{
    /* some code handling here */
    return ""; //your own formated string
}
-1
ответ дан 1 December 2019 в 03:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: