web-dev-qa-db-fra.com

Le moyen le plus rapide de rechercher la valeur NULL et d’affecter une autre valeur sinon

J'extrais varchar des valeurs d'une base de données et souhaite définir le string auquel je les attribue comme "" s'il s'agit de null. Je le fais actuellement comme ça:

if (string.IsNullOrEmpty(planRec.approved_by) == true)
  this.approved_by = "";
else
  this.approved_by = planRec.approved_by.toString();

Il semble qu'il devrait y avoir un moyen de faire cela en une seule ligne comme ceci:

this.approved_by = "" || planRec.approved_by.toString();

Cependant, je ne trouve pas de manière optimale de le faire. Y a-t-il un meilleur moyen ou est-ce ce que j'ai le meilleur moyen de le faire?

63
Splashlin

Essaye ça:

this.approved_by = IsNullOrEmpty(planRec.approved_by) ? "" : planRec.approved_by.toString();

Vous pouvez également utiliser l'opérateur null-coalescing comme d'autres l'ont déjà dit - puisque personne n'a donné d'exemple qui fonctionne avec votre code, en voici un:

this.approved_by = planRec.approved_by ?? planRec.approved_by.toString();

Mais cet exemple ne fonctionne que depuis une valeur possible pour this.approved_by est identique à l'une des valeurs potentielles que vous souhaitez définir. Pour tous les autres cas, vous devrez utiliser l'opérateur conditionnel, comme je l'ai montré dans mon premier exemple.

84
Andrew Hare

L'opérateur coalesce (??) est ce que vous voulez, je crois.

29
Dave Ward

Je pense que le mieux que vous puissiez trouver est

this.approved_by = IsNullOrEmpty(planRec.approved_by) ? string.Empty
                                                      : planRec.approved_by.ToString();

Bien sûr, étant donné que vous faites allusion au fait que approved_by est un object (qui ne peut être égal à ""), cela serait réécrit comme

this.approved_by = (planRec.approved_by ?? string.Empty).ToString();
25
Dmitri Nesteruk

Vous recherchez l'opérateur de coalesce C #: ??. Cet opérateur prend un argument gauche et droit. Si le côté gauche de l'opérateur est null ou nullable sans valeur, il retournera le bon argument. Sinon, il retournera la gauche.

var x = somePossiblyNullValue ?? valueIfNull;
22
JaredPar

Avec C # 6, le cas où planRec.approved_by n'est pas une chaîne est un peu plus court:

this.approved_by = planRec.approved_by?.ToString() ?? "";
13
Malcolm

Utilisez l'opérateur de fusion C #: ??

// if Value is not null, newValue = Value else if Value is null newValue is YournullValue
var newValue = Value ?? YourNullReplacement;
10
Ramgy Borja

Pour étendre @ la réponse de Dave ... si planRec.approved_by est déjà une chaîne

this.approved_by = planRec.approved_by ?? "";
9
Paul Alexander

Pour affecter une variable non vide sans répéter le nom de la variable actuelle (et sans rien affecter si la variable est null!), Vous pouvez utiliser une petite méthode d'assistance avec un paramètre Action:

public static void CallIfNonEmpty(string value, Action<string> action)
{
    if (!string.IsNullOrEmpty(value))
        action(value);
}

Et puis juste l'utiliser:

CallIfNonEmpty(this.approved_by, (s) => planRec.approved_by = s);
2
Jack Miller

Vous pouvez également le faire dans votre requête, par exemple dans le serveur SQL, les fonctions intégrées de Google ISNULL et CASE.

1
user133371