2015-08-21 16 views
23

Ecco un frammento del mio codice:Come restituire una stringa vuota se un oggetto è nullo?

var link = socials.Where(p => p.type == Facebook).FirstOrDefault().URL; 

il problema è che non ci sono oggetto sociale nella lista, FirstOrDefault() ritorno null, e .URL grilletto un'eccezione.

Come posso evitare questo in "una" linea con LINQ? Pertanto, se il valore restituito è vuoto, stringa "" (o personalizzata ancora meglio), altrimenti .URL?

+0

è possibile utilizzare .First(); –

+8

@SirwanAfifi: che causa un'eccezione se non esiste un tipo == facebook. –

risposta

40

È possibile utilizzare DefaultIfEmpty con un argomento per specificare il valore di fallback:

var link = socials 
    .Where(p => p.type == Facebook) 
    .Select(p => p.Url) 
    .DefaultIfEmpty("") 
    .First(); 

FirstOrDefault non è più necessario, è sicuro da usare con FirstDefaultIfEmpty.

+0

Ma DefaultIfEmpty funziona anche se l'oggetto Select return 0? Voglio dire, se il conteggio di dove è 0, restituisce almeno un ""? – markzzz

+3

Sì, questo è l'unico scopo di "DefaultIfEmpty". Viene solo in gioco se la sequenza non contiene elementi. Quindi utilizza il valore predefinito del tipo o - se si utilizza il sovraccarico come nella mia risposta - utilizza il valore fornito. Quindi con lo stesso risultato come se la sequenza contenesse solo un elemento con quel valore. –

15

Un'altra opzione consiste nell'utilizzare operatore fondono nullo

var link = (socials 
    .Where(p => p.type == Facebook) 
    .Select(p => p.Url) 
    .FirstOrDefault()) ?? string.empty; 

compresi che string.empty è preferito rispetto "" ma che può non essere il caso - vedi commento.

UPDATE In C# 6 v'è un operatore condizionale null (noto anche come l'operatore "Elvis"):

var link = socials 
    .Where(p => p.type == Facebook) 
    .Select(p => p.Url) 
    .FirstOrDefault()?.URL ?? string.empty; 

Un semplice esempio:

stringbuilder sb = null; 
// do work 
string s = sb?.ToString() ?? "no values found"; 
+5

Perché 'string.empty' è preferito a' "" "? È solo una questione di preferenze personali. Imo "" "è molto chiaro. –

+2

C'è una sottile differenza tra la tua e la mia risposta. Si ottiene 'String.Empty' se non c'è' type == facebook' e anche se il primo 'Url' corrispondente è 'null'. [Il mio approccio] (http://stackoverflow.com/a/32138070/284240) restituisce ancora 'null' in quel caso. –

+0

http://stackoverflow.com/questions/263191/in-c-should-i-use-string-empty-or-string-empty-or – Steve

6

con C# 6 si possibile utilizzare null-conditional operator (?.) per restituire l'URL se l'oggetto restituito dall'istruzione LINQ non è null, ovvero se è stato trovato un valore o null altro.

var link = socials.Where(p => p.type == Facebook).FirstOrDefault()?.URL; 

Se poi si desidera modificare un valore null ad una stringa vuota o una stringa personalizzata quindi utilizzare il null-coalescing operator (??).

var link = socials.Where(p => p.type == Facebook).FirstOrDefault()?.URL ?? "No URL"; 

Va notato che questo non farà alcuna distinzione tra se un oggetto non è stato trovato o un oggetto è stato trovato ma aveva un valore null URL.

Problemi correlati