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
?
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 First
DefaultIfEmpty
.
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";
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.