如何创建自己的自定义ToString()格式?

fis*_*ead 15 c# string-formatting

我想指定格式的ToString格式,但我不确定处理这个的最佳方法.

例如,如果我有以下说明符

  • EE =设备
  • ED =设备描述
  • EI =设备ID

所以,如果我使用ToString这样的:

eqp.ToString("EE-EI (ED)")
Run Code Online (Sandbox Code Playgroud)

输出可能是:

"CAT994-61 (Front end loader)"
Run Code Online (Sandbox Code Playgroud)

最好的方法是搜索子串并进行令牌替换吗?有没有人有这样做的例子?

我正在做顺序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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Ami*_*shk 15

结合字符串格式,并重载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);
}
Run Code Online (Sandbox Code Playgroud)

您还可以使用正则表达式来使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
Run Code Online (Sandbox Code Playgroud)

String.Format使您可以灵活地定位格式变量,例如,多次使用它们,或者删除一些.


Kev*_*ale 6

首先覆盖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();
}
Run Code Online (Sandbox Code Playgroud)

这在一次通过中具有相对较小的优点,这比多个字符串替换调用更有效.