我想指定ToString
格式的格式,但我不确定处理此问题的最佳方法。
例如,如果我有以下说明符
因此,如果我使用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;
}
}
答案 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
}