2010-02-07 17 views
13

Desidero specificare il formato del formato ToString, ma non sono sicuro del modo migliore per gestirlo.Come posso creare il mio formato ToString() personalizzato?

Ad esempio se ho le seguenti specificazioni

  • EE = usate
  • ED = usate descrizione
  • EI = Equipaggiamento ID

modo che se usato il ToString quanto tale :

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

l'output potrebbe essere:

"CAT994-61 (Front end loader)" 

Sarebbe il modo migliore è quello di cercare i sottostringhe e fare una sostituzione di token? Qualcuno ha un esempio di fare questo?

Attualmente sto facendo sequenziale string.Replace, che funziona bene.

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

risposta

13

La combinazione di formato stringa e di sovraccaricare il ToString si può fare questo:

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

È anche possibile utilizzare le espressioni regolari per rendere le funzioni Replace più belle.


questo può essere utilizzato come segue:

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 

Lo String.Format ti dà la flessibilità per posizionare le variabili formato alcun modo come, li hanno più volte, o far cadere un po '.

+0

il metodo string.format(), non diminuisce la flessibilità, vedi la mia modifica precedente. Ho usato la tua risposta, ma non ero sicuro del punto sul string.format() – fishhead

0

Utilizzare String.Format.

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

produce l'uscita prevista.

+0

quindi se ho mescolato i token come ToString ("EI - EE") funzionerebbe ancora? – fishhead

+0

'String.Format (" {1} - {0} ({2}) "," Foo "," Bar "," Baz ");' risulta in '" Bar-Foo (Baz) "'. –

0

Hai solo bisogno di sovraccaricare la funzione ToString nel vostro oggetto come

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

Prima di override ToString()

Poi, se si vuole che sia dinamica che si dovrebbe analizzare la stringa di formato un gettone alla volta e aggiungere la stringa appropriato per la stringa di output. L'utilizzo di specificatori di formato a singola lettera lo renderebbe un po 'più semplice poiché potresti analizzarlo un personaggio alla volta. Se si tratta di un carattere speciale, si emettono i dati appropriati, altrimenti si genera il carattere.

Quindi, qualcosa di simile

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

Questo ha il vantaggio relativamente minore di farlo in un solo passaggio, che è più efficiente di stringa multipla sostituire le chiamate.

+0

+1, mi piace, è meglio della mia sostituzione. – Amirshk

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

finirà passando "foo"-object.ToString(string format); quindi ha senso per progettare gli argomenti che il metodo ToString(string format) prende con questo in mente. Nel tuo esempio

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

si tradurrebbe in "EI - EE" essere passato al metodo ToString sull'oggetto, quindi questo potrebbe funzionare come lei, ma potrebbe avere più senso per limitare il formato ad una rappresentanza in un tempo, come questo

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

sarebbe il modo per ottenere "CAT994-61" come uscita, e il vostro ToString() metodo potrebbe essere più semplice

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

Se si riduce l'identificatori di formato a singola let Ciò sarebbe più coerente con il modo in cui gli altri oggetti gestiscono i formati ToString.

Problemi correlati