Existe-t-il un moyen plus agréable de faire ce qui suit:
J'ai besoin d'une vérification de la présence de null sur le fichier.Headers avant de poursuivre la boucle
if (file.Headers != null)
{
foreach (var h in file.Headers)
{
//set lots of properties & some other stuff
}
}
En bref, cela semble un peu moche d'écrire le foreach à l'intérieur du if en raison du niveau d'indentation qui se produit dans mon code.
Est-ce quelque chose qui serait évalué à
foreach(var h in (file.Headers != null))
{
//do stuff
}
possible?
Réponses:
Juste comme un léger ajout cosmétique à la suggestion de Rune, vous pouvez créer votre propre méthode d'extension:
Ensuite, vous pouvez écrire:
Changez le nom selon vos goûts :)
la source
En supposant que le type d'éléments dans file.Headers est T, vous pouvez le faire
cela créera un énumérable vide de T si file.Headers est nul. Si le type de fichier est un type que vous possédez, j'envisagerais cependant de changer le getter à la
Headers
place.null
est la valeur de unknown donc si possible au lieu d'utiliser null comme "Je sais qu'il n'y a pas d'éléments" alors que null en fait (/ à l'origine) devrait être interprété comme "Je ne sais pas s'il y a des éléments", utilisez un ensemble vide pour afficher que vous savez qu'il n'y a aucun élément dans l'ensemble. Ce serait également DRY'er puisque vous n'aurez pas à faire la vérification de null aussi souvent.EDIT comme suite à la suggestion de Jons, vous pouvez également créer une méthode d'extension en changeant le code ci-dessus en
Dans le cas où vous ne pouvez pas changer le getter, ce serait mon préféré car il exprime l'intention plus clairement en donnant un nom à l'opération (OrEmptyIfNull)
La méthode d'extension mentionnée ci-dessus peut rendre certaines optimisations impossibles à détecter par l'optimiseur. Plus précisément, ceux qui sont liés à IList en utilisant une surcharge de méthode peuvent être éliminés
la source
null
) dégénérant la boucle entière vers LCD deIEnumerable<T>
(comme l'utilisation de ?? aurait), b) exigerait d'ajouter une méthode d'extension à chaque projet, ou c) exigerait d'éviternull
IEnumerables
(Pffft! Puh-LEAZE! SMH.) pour commencer (cuznull
signifie N / A, alors qu'une liste vide signifie, c'est applicable mais est actuellement, enfin, vide !, c'est-à-dire qu'un employé pourrait avoir des commissions N / A pour les non-ventes ou vides pour les ventes alors qu'il n'en a pas gagné).IEnumerable
qui est plus restrictif que lesforeach
exigences mais moins restrictif que l'exigence deList<T>
dans la réponse à laquelle vous créez un lien. Qui ont la même pénalité de performances de tester si l'énumérable est nul.List<T>
.Franchement, je conseille: il suffit d'aspirer
null
test. Unnull
test est juste unbrfalse
oubrfalse.s
; tout le reste va impliquer beaucoup plus de travail (tests, devoirs, appels de méthodes supplémentaires, inutilesGetEnumerator()
,MoveNext()
,Dispose()
sur le iterator, etc.).Un
if
test est simple, évident et efficace.la source
le "si" avant l'itération est correct, peu de ces "jolies" sémantiques peuvent rendre votre code moins lisible.
de toute façon, si l'indentation vous dérange, vous pouvez changer le if pour vérifier:
et vous n'obtiendrez la boucle foreach que s'il y a une valeur vraie dans la propriété headers.
une autre option à laquelle je peux penser consiste à utiliser l'opérateur de fusion null dans votre boucle foreach et d'éviter complètement la vérification null. échantillon:
(remplacez la collection par votre véritable objet / type)
la source
Utilisation de l' opérateur conditionnel Null et de ForEach () qui fonctionne plus rapidement que la boucle foreach standard.
Vous devez cependant convertir la collection dans List.
la source
J'utilise une jolie petite méthode d'extension pour ces scénarios:
Étant donné que les en-têtes sont de type liste, vous pouvez faire ce qui suit:
la source
??
opérateur et raccourcir l'instruction de retour àreturn list ?? new List<T>;
null
votre échantillonfile.Headers.EnsureNotNull() != null
n'est pas nécessaire, et est même faux?Dans certains cas, je préférerais légèrement une autre variante générique, en supposant que, en règle générale, les constructeurs de collection par défaut renvoient des instances vides.
Il serait préférable de nommer cette méthode
NewIfDefault
. Cela peut être utile non seulement pour les collections, donc la contrainte de typeIEnumerable<T>
est peut-être redondante.la source