Comment retourner une chaîne vide si un objet est null?

Voici un extrait de mon code:

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

le problème est qu'il n'y a pas d'un objet dans la liste, FirstOrDefault() retour null et .URL déclencher une exception.

Comment puis-je éviter cela dans la ligne "un" avec LINQ? Ainsi, si null retourne vide "" (ou personnalisée est encore mieux) de chaîne, d'autre .URL?

23
demandé sur markzzz 2015-08-21 13:24:45

3 réponses

Vous pouvez utiliser DefaultIfEmpty avec un argument pour spécifier la valeur de repli:

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

FirstOrDefault il n'est plus nécessaire, il est sûr à utiliser FirstDefaultIfEmpty.

40
répondu Tim Schmelter 2015-08-21 10:28:23

une autre option est d'utiliser l'opérateur null coalesce

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

j'ai compris que string.empty est préférable à "" mais qui peut ne pas être le cas - voir le commentaire ci-dessous.

UPDATE Dans C# 6, Il y a un opérateur null conditional (aussi connu sous le nom d'opérateur "Elvis"):

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

Un exemple simple:

stringbuilder sb = null;
// do work
string s = sb?.ToString() ?? "no values found"; 
16
répondu Peter Smith 2016-11-15 14:12:43

en utilisant C# 6 Vous pouvez utiliser un opérateur null-conditionnel (?.) pour retourner L'URL si l'objet retourné de la déclaration LINQ n'est pas null, c'est à dire si une valeur a été trouvé, ou null otherwsie.

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

Si vous souhaitez modifier un null la valeur est une chaîne vide ou une chaîne personnalisée puis utilisez le null-coalescence de l'opérateur (??).

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

il est à noter que ceci ne fera pas de distinction entre un objet n'a pas été trouvé ou si un objet a été trouvé, mais avait un null valeur de L'URL.

6
répondu kjbartel 2015-08-24 00:38:50