Come formattare in modo condizionale una stringa in .Net?

Mi piacerebbe fare alcune condizioni di formattazione delle stringhe. So che puoi eseguire alcune formattazioni condizionali di numeri interi e float come segue:

Int32 i = 0; i.ToString("$#,##0.00;($#,##0.00);Zero"); 

Il codice sopra risulterebbe in uno dei tre formati se la variabile è positiva, negativa o zero.

Vorrei sapere se esiste un modo per utilizzare le sezioni sugli argomenti stringa. Per un esempio concreto, ma forzato , vorrei sostituire il controllo “if” nel seguente codice:

 string MyFormatString(List items, List values) { string itemList = String.Join(", " items.ToArray()); string valueList = String.Join(", " values.ToArray()); string formatString; if (items.Count > 0) //this could easily be: //if (!String.IsNullOrEmpty(itemList)) { formatString = "Items: {0}; Values: {1}"; } else { formatString = "Values: {1}"; } return String.Format(formatString, itemList, valueList); } 

Bene, puoi semplificarlo un po ‘con l’operatore condizionale:

 string formatString = items.Count > 0 ? "Items: {0}; Values: {1}" : "Values: {1}"; return string.Format(formatString, itemList, valueList); 

O anche includerlo nella stessa dichiarazione:

 return string.Format(items.Count > 0 ? "Items: {0}; Values: {1}" : "Values: {1}", itemList, valueList); 

E ‘quello che stai cercando? Non penso che tu possa avere una singola stringa di formato che a volte include bit e talvolta no.

Non all’interno di String.Format (), ma è ansible utilizzare gli operatori inline di C #, ad esempio:

 return items.Count > 0 ? String.Format("Items: {0}; Values: {1}", itemList, valueList) : String.Format("Values: {0}", valueList); 

Ciò aiuterebbe a riordinare il codice.

Anche se non si rivolge direttamente al PO, questo rientra anche nel titolo della domanda.

Ho spesso bisogno di formattare le stringhe con alcune unità personalizzate, ma nei casi in cui non dispongo di dati, non voglio produrre nulla. Lo uso con vari tipi annullabili:

 ///  /// Like String.Format, but if any parameter is null, the nullOutput string is returned. ///  public static string StringFormatNull(string format, string nullOutput, params object[] args) { return args.Any(o => o == null) ? nullOutput : String.Format(format, args); } 

Ad esempio, se sto formattando temperature come “20 ° C”, ma trovo un valore nullo, stamperà una stringa alternativa invece di “° C”.

 double? temp1 = 20.0; double? temp2 = null; string out1 = StringFormatNull("{0}°C", "N/A", temp1); // "20°C" string out2 = StringFormatNull("{0}°C", "N/A", temp2); // "N/A" 
 string.Format( (items.Count > 0 ? "Items: {0}; " : "") + "Values {1}" , itemList , valueList); 

Non farlo. Non ho idea di cosa siano sia gli elementi che i valori nel tuo codice, ma credo che questa coppia potrebbe essere considerata come un’ quadro di qualche tipo. Definisci questa entity framework come una class e sostituisci il suo metodo ToString() per restituire quello che vuoi. Non c’è assolutamente nulla di sbagliato nell’avere if per decidere come formattare questa stringa a seconda del contesto.

Questo probabilmente non è quello che stai cercando, ma che dire …

 formatString = (items.Count > 0) ? "Items: {0}; Values: {1}" : "Values: {1}"; 

Speravo che questo potesse farlo:

 return String.Format(items.ToString(itemList + " ;;") + "Values: {0}", valueList); 

Sfortunatamente, sembra che il metodo .ToString () non apprezzi le opzioni vuote negative e zero o non abbia un # o 0 ovunque. Lo lascerò qui nel caso in cui punti qualcun altro a una risposta migliore.