2010-02-07 22 views
13

Me gustaría especificar el formato del formato ToString, pero no estoy seguro de la mejor manera de manejar esto.¿Cómo creo mi propio formato ToString() personalizado?

Por ejemplo, si tengo los siguientes especificadores

  • EE = equipo
  • ED = equipamiento Descripción
  • EI = equipo ID

de modo que si utilicé el ToString como tal :

eqp.ToString("EE-EI (ED)") 

la salida podría ser:

"CAT994-61 (Front end loader)" 

sería la mejor manera de buscar las subseries y hacer una sustitución del token? ¿Alguien tiene un ejemplo de hacer esto?

Actualmente estoy haciendo secuencial string.Replace, que funciona muy bien.

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

Respuesta

13

Combinando formato de cadena, y la sobrecarga de la ToString usted puede hacer esto:

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

También puede utilizar expresiones regulares para hacer que las funciones Replace sean más agradables.


Esto se puede utilizar de la siguiente manera:

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 

El String.Format le da la flexibilidad para posicionar las variables con formato de ninguna manera similar, ellos tienen múltiples veces, o dejar caer alguna.

+0

el método string.format(), no disminuye la capacidad de flexión, consulte mi edición anterior. Utilicé su respuesta, pero no estaba seguro del punto en el string.format() – fishhead

0

Use String.Format.

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

produce la salida esperada.

+0

así que si mezclé los tokens como ToString ("EI - EE") todavía funcionaría? – fishhead

+0

'String.Format (" {1} - {0} ({2}) "," Foo "," Barra "," Baz ");' da como resultado '" Bar-Foo (Baz) "'. –

0

sólo tiene que sobrecargar la función ToString en su objeto como

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

Primera ToString anulación()

Entonces, si usted quiere que sea dinámico que tendría que analizar la cadena de formato de una ficha a la vez y añadir la cadena apropiado para su cadena de salida. El uso de especificadores de formato de una sola letra lo haría un poco más simple ya que podría analizar un carácter a la vez. Si se trata de un carácter especial, se envían los datos apropiados, de lo contrario se genera el carácter.

Así que algo como esto

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

Esto tiene la ventaja relativamente menor de hacerlo en una sola pasada, que es más eficiente que la cadena de múltiples reemplazar las llamadas.

+0

+1, me gusta, es mejor que mi reemplazo. – Amirshk

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

va a terminar pasando a "foo"object.ToString(string format); así que tiene sentido para diseñar los argumentos de que su método de ToString(string format) toma con esto en mente. En su ejemplo

String.Format("{0:EI - EE}", object); 

se traduciría en "IE - EE" se pasa al método ToString en el objeto, por lo que esto podría funcionar como usted la describe, pero podría tener más sentido para restringir el formato de una representación a una tiempo, como esto

String.Format("{0:EI} - {0:EE}", object); 

sería la manera de conseguir "CAT994-61" como salida, y() método podría ser su más simple 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; 
} 

Si reduce sus especificadores de formato a una sola let ters, eso sería más consistente con la forma en que otros objetos manejan los formatos ToString.

Cuestiones relacionadas