2017-04-09 3 views
0

Quelqu'un peut-il me dire comment optimiser le code ci-dessous.C# nullable vérifier l'optimisation

if (report != null && 
    report.Breakdown != null && 
    report.Breakdown.ContainsKey(reportName.ToString()) && 
    report.Breakdown[reportName.ToString()].Result != null 
    ) 
+1

Optimize comment? Performance? Plus court? Autre chose? – TheLethalCoder

+0

Quelle version de C# utilisez-vous? L'opérateur conditionnel nul de C# 6 peut aider ici. –

+0

Créez une opération IsNull() sur votre définition de type Report qui effectue toutes les vérifications nuls pour le rapport. Ensuite, vous pouvez simplement l'appeler. –

Répondre

3

Comme d'autres l'ont mentionné, vous pouvez utiliser l'opérateur ?. combiner certains de vos chèques nuls. Toutefois, si vous êtes après l'optimisation de la performance, vous devriez éviter la double recherche dictionnaire (ContainsKey et accès à l'index), va pour une place TryGetValue:

MyType match = null; // adjust type 
if (report?.Breakdown?.TryGetValue(reportName.ToString(), out match) == true && 
    match?.Result != null) 
{ 
    // ... 
} 
+0

Ne pas faire "== true" ;-) – Lucero

+0

@Lucero: Vous devez dans ce cas, car le résultat est 'bool?'; sinon, le compilateur donnera une erreur de syntaxe. – Douglas

+0

@Douglas Vous pouvez utiliser l'opérateur de coalescence null '??', soit bien cependant. – TheLethalCoder

0

Vous pouvez utiliser l'opérateur null conditionnelle, mais seulement sur C# 6

if (report?.Breakdown?.ContainsKey(reportName.ToString()) == true && 
    report.Breakdown[reportName.ToString()].Result != null) 
+0

Donne une erreur de compilation comme: Opérateur && ne peut pas être appliqué à des opérandes de type bool et bool? –

+0

désolé à ce sujet, il est corrigé maintenant –

0

La réponse de Ayman est probablement le meilleur que vous pouvez faire pour C# 6, pour avant que ce que vous avez, il est à peu près le meilleur vous pouvez le faire si tous ces objets sont nullables. La seule façon d'optimiser cela est de vérifier si ces objets sont nuls avant même d'appeler le code, ou mieux encore d'éprouver votre plate-forme pour que cette fonction particulière ne soit même pas appelée en premier lieu si les valeurs sont nul.

Si vous obtenez simplement la valeur du dictionnaire mais vous pouvez aussi simplifier avec l'opérateur de coalescence nulle '??'

Exemple:

MyDictionary['Key'] ?? "Default Value"; 

Ainsi, si la valeur à cette entrée est nulle, vous obtiendrez la valeur par défaut à la place.

Donc, si cela est juste FETCH que je venais d'aller

var foo = 
    report != null && 
    report.Breakdown != null && 
    report.Breakdown.ContainsKey(reportName.ToString()) ? 
    report.Breakdown[reportName.ToString()].Result ?? "Default" : 
    "Default"; 

Mais si vous êtes en train de faire des choses dans la boucle, alors oui, vous êtes à peu près au mieux que vous pouvez y arriver.

0

Pour C# 6 et plus récent, vous pouvez le faire de cette façon:

if (report?.Breakdown?.ContainsKey(reportName.ToString()) == true && 
    report.Breakdown[reportName.ToString()].Result != null) 
0

Pouvez-vous essayer ci-dessous? Aussi probablement préférable de l'expédier à une méthode.

// unless report name is already a string 
string reportNameString = reportName.ToString(); 
if (report?.Breakdown?.ContainsKey(reportNameString) && 
    report.Breakdown[reportNameString].Result != null) 
{ 
    // rest of the code 
}