Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何创建自己的自定义ToString()格式?_C#_String Formatting - Fatal编程技术网

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

C# 如何创建自己的自定义ToString()格式?,c#,string-formatting,C#,String Formatting,我想指定ToString格式的格式,但我不确定处理此问题的最佳方法 String.Format("{0:foo}", object); 例如,如果我有以下说明符 String.Format("{0:foo}", object); EE=设备 ED=设备说明 EI=设备ID 因此,如果我使用ToString: eqp.ToString("EE-EI (ED)") String.Format("{0:foo}", object); 输出可能是: "CAT994-61 (Front end

我想指定
ToString
格式的格式,但我不确定处理此问题的最佳方法

String.Format("{0:foo}", object);
例如,如果我有以下说明符

String.Format("{0:foo}", object);
  • EE=设备
  • ED=设备说明
  • EI=设备ID
因此,如果我使用
ToString

eqp.ToString("EE-EI (ED)")
String.Format("{0:foo}", object);
输出可能是:

"CAT994-61 (Front end loader)"
String.Format("{0:foo}", object);
最好的方法是搜索子字符串并进行令牌替换吗? 有人举过这样的例子吗

String.Format("{0:foo}", object);
我目前正在做sequential
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;
    }
}
String.Format("{0:foo}", object);

使用
String.Format

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

生成预期的输出。

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

public override string ToString()
{
    /* some code handling here */
    return ""; //your own formated string
}
String.Format("{0:foo}", object);

这种格式听起来是个不错的解决方案。
也许有几个好的正则表达式可以将输入变量分成若干组

String.Format("{0:foo}", object);
如果可以的话,我会尝试使用尽可能多的现有格式:

组合字符串格式,并重载
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);
}
String.Format("{0:foo}", object);
您还可以使用正则表达式使
Replace
函数更好

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

这可以按如下方式使用:

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("{0:foo}", object);
Format使您可以灵活地定位格式变量,例如多次放置或删除一些变量。

First override ToString()

String.Format("{0:foo}", object);
然后,如果希望它是动态的,则必须一次解析一个标记的格式字符串,并将适当的字符串添加到输出字符串中。使用单字母格式说明符会使它更简单,因为您可以一次解析一个字符。如果是特殊字符,则输出相应的数据,否则输出该字符

String.Format("{0:foo}", object);
像这样的

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();
}
String.Format("{0:foo}", object);
这有一个相对较小的优势,即一次调用比多次字符串替换调用更有效

String.Format("{0:foo}", object);
最后将
“foo”
传递到
对象.ToString(字符串格式)ToString(字符串格式)
方法所采用的参数是有意义的。在你的例子中

String.Format("{0:foo}", object);
String.Format("{0:EI - EE}", object);
这将导致“EI-EE”被传递给对象上的ToString方法,因此这可以像您所描述的那样工作,但将格式一次限制为一个表示形式可能更有意义,如下所示

String.Format("{0:foo}", object);
String.Format("{0:EI} - {0:EE}", object);
将是获取“CAT994-61”作为输出的方法,并且您的ToString()方法可能更简单

String.Format("{0:foo}", object);
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格式的方式更加一致。

因此,如果我将标记像ToString(“EI-EE”)一样混合,它仍然可以工作?
String.format(“{1}-{0}({2})”,“Foo”,“Bar”,“Baz”)
导致
“Bar Foo(Baz)”
。string.format()方法,如果不降低灵活性,请参见我上面的编辑。我确实使用了你的答案,但我不确定字符串的要点
String.Format("{0:foo}", object);