Domanda

Ho un sacco di stringhe ho bisogno di usare .Trim (), ma si può essere nulla. Sarebbe molto più conciso se potessi fare qualcosa di simile:

string endString = startString !?? startString.Trim();

In sostanza restituire la parte a destra se la parte a sinistra non è nullo, altrimenti solo restituisce il valore null. Ho appena finito per usare l'operatore ternario, ma c'è comunque di usare l'operatore null-coalescenza per questo scopo?

È stato utile?

Soluzione

Si potrebbe creare un metodo di estensione che restituisce null quando si cerca di tagliare il valore.

public String TrimIfNotNull(this string item)
{
   if(String.IsNullOrEmpty(item))
     return item;
   else
    return item.Trim();
}

Nota È possibile non nominarlo Trim perché metodi di estensione non possono sostituire i metodi di istanza.

Altri suggerimenti

Non spec: Non è che mi piace, ma è possibile utilizzare:

string endString = (startString ?? String.Empty).Trim();

Per spec, meglio come un metodo di estensione, come @ Kevin:

string endString = (startString == null ? null : startString.Trim());
string endString = string.IsNullOrEmpty(startString) ? startString : startString.Trim();

Anche se ho anche andato il percorso di scrittura di un metodo di estensione stringa chiamata "safeTrim", che fa quello che stai descrivendo in un metodo, invece di dover utilizzare questa ricetta ogni volta. Scopri di Kevin respone per il codice.

Modifica : wow ho avuto tutti i tipi di all'indietro, variabili chiamate a torto e invertito operatori ternari, a maggior ragione di scrivere un metodo di estensione e il codice di controllo che meglio di me

Usa

string endString = (startString ?? "").Trim();

Questo utilizza una stringa empy se inizioStringa è nullo. Questo, tuttavia, non fa non nulla di ritorno quando endString è nullo.

Ci scusiamo per la necromanzia, ma ho avuto lo stesso problema e ho risolto questo con un operazione lambda. Non è la più bella, ma mantiene il mio codice succinta.

E 'un peccato C # non supporta le importazioni statiche o importazioni di funzioni individuali, ma in ogni caso:

Definisci questa funzione da qualche parte:

private static TResult N<TParent,TResult>(TParent parent, Func<TParent,TResult> operation) {
    if( parent == null ) return default(TResult);
    return operation( parent );
}

Poi per utilizzarlo nel tuo esempio:

String endString = N(startString, s => s.Trim());

I rendimenti funzionali N null se il primo argomento è nullo, altrimenti valutare la funzione lambda specificato con il valore come argomento.

È possibile nidificare, naturalmente, in questo modo. Ad esempio, per sicurezza dereferenziare una lunga catena, per es.

String someValue = someObject.SomeProperty.SomeOtherProperty.SomeMethod().SomeFinalProperty;

Se uno di questi metodi o proprietà restituisce null, allora è necessario inserire controlli nulli ovunque, o si potrebbe fare questo:

String someValue = N(N(N(N(someObject, o => o.SomeProperty), o => o.SomeOtherProperty), o => o.SomeMethod()), o => o.SomeFinalProperty);

Come ho detto, non è la più bella:)

Si potrebbe semplificare questo facendo N un metodo di estensione di System.Object, in questo modo:

String someValue = someObject.N( o => o.SomeProperty ).N( o => o.SomeOtherProperty ).N( o => o.SomeMethod() ).N( o => o.SomeFinalProperty );

... che credo sia un più ordinato molto.

Di seguito le fa nulla non propagano ma accetta nullo come parametro e restituisce una stringa vuota in quel caso.

using Microsoft.VisualBasic;  // you need to add a reference to Microsoft.VisualBasic.dll

    ...
    string endString = Strings.Trim(startString);
    ...

Duck & run ...

Creare un metodo come ad esempio:

string MyTrim(string a) {
    if (a != null) {
        a = a.Trim();
    }
    return a;
}

Come come nota a margine, se si sta utilizzando .NET 4, c'è un nuovo metodo conveniente String.IsNullOrWhiteSpace che si può usare.

A partire con C # 6.0 (.NET Framework 4.6 / Visual Studio 2015) è possibile utilizzare Null condizionale member :

 string? endString = startString?.Trim();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top