Vérifier la valeur null dans une boucle foreach
Est-il une plus belle façon de faire les suivants:
J'ai besoin d'un chèque de la valeur null pour arriver sur le fichier.Les en-têtes avant de procéder à la boucle
if (file.Headers != null)
{
foreach (var h in file.Headers)
{
//set lots of properties & some other stuff
}
}
En bref, il ressemble un peu moche d'écrire le foreach à l'intérieur de la si en raison du niveau d'indentation qui se passe dans mon code.
Est quelque chose qui permettrait d'évaluer à
foreach(var h in (file.Headers != null))
{
//do stuff
}
possible?
- Vous pouvez jetez un oeil ici: stackoverflow.com/questions/6937407/...
- stackoverflow.com/questions/872323/... c'est une autre idée.
- Je pense que c'est complètement différent. La question vérifie si la collection est nul d'abord avant de faire la for-each. Votre lien vérifie si l'élément de la collection est null.
- Similaire à stackoverflow.com/q/3088147/80161 et stackoverflow.com/q/6455311/80161
- C# 8 aurait pu se contenter d'un nul conditionnelle foreach, de la sorte, c'est à dire de la syntaxe ressemble à ceci: foreach? (var i dans la collection) { } je pense que c'est un scénario assez pour justifier cela, et compte tenu de la récente null-à condition que les ajouts à la langue qu'il a du sens ici?
Vous devez vous connecter pour publier un commentaire.
Comme une légère cosmétiques plus de Rune de la suggestion, vous pouvez créer votre propre méthode d'extension:
Ensuite, vous pouvez écrire:
Changer le nom selon le goût 🙂
null
) dégénérescentes la totalité de la boucle à écran LCD deIEnumerable<T>
(comme l'aide ?? serait), b) nécessitent l'ajout d'une Méthode d'Extension pour chaque Projet, ou c) exiger d'éviternull
IEnumerables
(Pffft! Po-LEAZE! SMH.) pour commencer (cuznull
moyen N/A, tandis que la liste vide signifie, c'est applicable, mais est actuellement, bien, il est vide!, c'est à dire un Employé pourrait avoir des Commissions que de N/A pour non-Vente ou de vide pour les Ventes, quand ils ne l'ont pas gagnée).En supposant que le type d'éléments dans le fichier.Les en-têtes est T possible de le faire
cela va créer un vide énumérable de T si fichier.Les en-têtes est null. Si le type de fichier est un type propre je voudrais, toutefois, envisager de changer le getter de
Headers
à la place.null
est la valeur de inconnu, donc si possible au lieu d'utiliser la valeur null comme "je sais il n'y a pas d'éléments" lorsque la valeur null en fait(/à l'origine) doit être interprété comme "je ne sais pas s'il y a des éléments" utiliser un ensemble vide de montrer que vous savez il n'y a pas d'éléments dans le jeu. Ce serait aussi SEC depuis que vous n'aurez pas à faire le nul de vérifier souvent.MODIFIER suivi sur Jons suggestion, vous pouvez également créer une méthode d'extension de changer le code ci-dessus pour
Dans le cas où vous ne pouvez pas changer le getter, ce serait mon propre privilégiée parce qu'elle exprime l'intention plus clairement en donnant de l'opération un nom (OrEmptyIfNull)
L'extension de la méthode mentionnée ci-dessus peut rendre certaines optimisations impossible pour l'optimiseur à détecter. Plus précisément, ceux qui sont liés à IList à l'aide de la surcharge de méthode ce risque peut être éliminé
null
) dégénérescentes la totalité de la boucle à écran LCD deIEnumerable<T>
(comme l'aide ?? serait), b) nécessitent l'ajout d'une Méthode d'Extension pour chaque Projet, ou c) exiger d'éviternull
IEnumerables
(Pffft! Po-LEAZE! SMH.) pour commencer (cuznull
moyen N/A, tandis que la liste vide signifie, c'est applicable, mais est actuellement, bien, il est vide!, c'est à dire un Employé pourrait avoir des Commissions que de N/A pour non-Vente ou de vide pour les Ventes, quand ils ne l'ont pas gagnée).IEnumerable
qui est plus restrictif que leforeach
besoins, mais il est moins restrictive que la condition deList<T>
dans la réponse que vous liez. Qui ont le même rendement peine de tester si le énumérable est null.List<T>
.Franchement, je conseille: tout le sucer jusqu'à la
null
test. Unnull
test est juste unbrfalse
oubrfalse.s
; tout le reste va impliquer beaucoup plus de travail (tests, de devoirs, de extra les appels de méthode, inutileGetEnumerator()
,MoveNext()
,Dispose()
sur l'itérateur, etc).Un
if
test est simple, évidente et efficace.le "si" avant l'itération est très bien, quelques-uns de ces "jolis" sémantique peut rendre votre code moins lisible.
de toute façon, si l'indentation qui perturbe votre, vous pouvez modifier la si la pour vérifier:
et vous obtiendrez à la boucle foreach seulement quand il y a la valeur true à la propriété headers.
une autre option que je peux penser est l'aide de l'null-coalescence de l'opérateur à l'intérieur de votre boucle foreach et d'éviter complètement nulle vérification.
exemple:
(remplacer la collecte avec votre véritable objet/type)
À l'aide de Null-Opérateur conditionnel et ForEach() qui fonctionne plus rapidement que celle de la boucle foreach.
Vous devez lancer la collection à la Liste si.
Je suis à l'aide d'un joli petit méthode d'extension de ces scénarios:
Étant donné que les en-Têtes est de type liste, vous pouvez effectuer les opérations suivantes:
??
de l'opérateur et de raccourcir l'instruction de retour àreturn list ?? new List<T>;
null
dans votre échantillonfile.Headers.EnsureNotNull() != null
n'est pas nécessaire, et est le même problème?Pour certains cas, je préfère légèrement l'autre, générique variante, en supposant que, en règle générale, le défaut de collecte des constructeurs de retour à vide instances.
Il serait préférable de le nom de cette méthode
NewIfDefault
. Il peut être utile non seulement pour les collections, afin contrainte de typeIEnumerable<T>
est peut-être redondant.