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

时间:2010-02-07 23:25:44

标签: c# string-formatting

我想指定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 个答案:

答案 0 :(得分: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);
}

您还可以使用正则表达式使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使您可以灵活地定位格式变量,例如,多次使用它们,或者删除一些。

答案 1 :(得分: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();
}

这在一次传递中具有相对较小的优势,这比多次字符串替换调用更有效。

答案 2 :(得分:2)

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格式的方式更加一致。

答案 3 :(得分:0)

使用String.Format

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

产生预期的输出。

答案 4 :(得分:0)

这种格式听起来很不错 也许(很少)很好的正则表达式将输入变量切割成组。

如果可以,我会尝试使用尽可能多的现有格式:
http://blog.stevex.net/string-formatting-in-csharp/

答案 5 :(得分:-1)

您只需要在对象中重载ToString函数,如

public override string ToString()
{
    /* some code handling here */
    return ""; //your own formated string
}