J'adore la string.IsNullOrEmpty
méthode. J'adorerais avoir quelque chose qui permettrait la même fonctionnalité pour IEnumerable. Y en a-t-il un? Peut-être une classe d'aide à la collecte? La raison pour laquelle je demande est que dans les if
déclarations, le code semble encombré si le motif l'est (mylist != null && mylist.Any())
. Ce serait beaucoup plus propre à avoir Foo.IsAny(myList)
.
Ce message ne donne pas cette réponse: IEnumerable est vide? .
c#
.net
linq
collections
ienumerable
Schultz9999
la source
la source
Réponses:
Bien sûr, vous pouvez écrire cela:
cependant, veillez à ce que toutes les séquences ne soient pas répétables; en général, je préfère ne les promener qu'une seule fois, au cas où.
la source
this
là - je considère les méthodes d'extension qui sont supposées être appeléesnull
comme un signe de conception laide..Any()
est une méthode d'extension qui fonctionne surIEnumerable<T>
(ouIQueryable<T>
, bien que ce soit un scénario différent). Cela consomme la séquence , au moins partiellement (bien que cela signifie toujours qu'elle est consommée) - il se peut qu'elle ne doive lire qu'un seul élément (surtout s'il n'y a pas de prédicat). En tant que tel, puisque les séquences (IEnumerable<T>
) n'ont pas besoin d'être répétables, c'est peut-être le cas .Any()
sans prédicat équivaut essentiellement àforeach(var x in sequence) { return true; } return false;
- bien qu'il utiliseGetEnumerator()
etc au lieu de la syntaxe du compilateurla source
IEnumerable
n'a pas d'Any()
extension.Voici une version modifiée de la réponse utile de @Matt Greer qui inclut une classe wrapper statique afin que vous puissiez simplement copier-coller ceci dans un nouveau fichier source, ne dépend pas de Linq, et ajoute une
IEnumerable<T>
surcharge générique , pour éviter la boxing des types de valeur cela se produirait avec la version non générique. [EDIT: Notez que l'utilisation deIEnumerable<T>
n'empêche pas la mise en boîte de l'énumérateur, le typage canard ne peut pas empêcher cela, mais au moins les éléments d'une collection à valeur typée ne seront pas chacun encadrés.]la source
Une autre façon serait d'obtenir l'énumérateur et d'appeler la méthode MoveNext () pour voir s'il y a des éléments:
Cela fonctionne pour IEnumerable ainsi que IEnumerable <T>.
la source
IEnumerable<T>
, car non génériqueIEnumerable
ne l'implémente pasIDisposable
.La façon dont je le fais, en tirant parti de certaines fonctionnalités modernes de C #:
Option 1)
Option 2)
Et d'ailleurs, ne jamais utiliser
Count == 0
ouCount() == 0
juste pour vérifier si une collection est vide. Utilisez toujours Linq's.Any()
la source
!
peut être, spécialement dans la deuxième option;)Cela peut aider
la source
À partir de C # 6, vous pouvez utiliser la propagation nulle :
myList?.Any() == true
Si vous trouvez toujours cela trop encombrant ou préférez une bonne méthode d'extension, je recommanderais les réponses de Matt Greer et Marc Gravell, mais avec un peu de fonctionnalités étendues pour être complet.
Leurs réponses fournissent les mêmes fonctionnalités de base, mais chacune dans une autre perspective. La réponse de Matt utilise la
string.IsNullOrEmpty
-mentalité, tandis que la réponse de Marc prend celle de Linq.Any()
route pour faire le travail.Je suis personnellement enclin à utiliser la
.Any()
route, mais je voudrais ajouter la fonctionnalité de vérification de l'état de l' autre surcharge de la méthode :Ainsi, vous pouvez toujours faire des choses comme:
myList.AnyNotNull(item=>item.AnswerToLife == 42);
comme vous le pourriez avec le.Any()
mais avec la vérification nulle ajoutéeNotez qu'avec la méthode C # 6:
myList?.Any()
retourne abool?
plutôt que abool
, qui est l'effet réel de la propagation de nullla source
la source
Voici le code de la réponse de Marc Gravell , avec un exemple d'utilisation.
Comme il le dit, toutes les séquences ne sont pas répétables, de sorte que le code peut parfois causer des problèmes, car
IsAny()
commence à parcourir la séquence. Je soupçonne que la réponse de Robert Harvey voulait dire que vous n'avez souvent pas besoin de vérifiernull
et de vider. Souvent, vous pouvez simplement vérifier la valeur null, puis utiliserforeach
.Pour éviter de démarrer la séquence deux fois et en profiter
foreach
, j'ai juste écrit un code comme celui-ci:Je suppose que la méthode d'extension vous évite quelques lignes de frappe, mais ce code me semble plus clair. Je soupçonne que certains développeurs ne se rendraient pas immédiatement compte que
IsAny(items)
cela commencerait réellement à parcourir la séquence. (Bien sûr, si vous utilisez beaucoup de séquences, vous apprenez rapidement à réfléchir à leurs étapes.)la source
j'utilise
Bool IsCollectionNullOrEmpty = !(Collection?.Any()??false);
. J'espère que cela t'aides.Panne:
Collection?.Any()
retourneranull
si Collection est nul, etfalse
si Collection est vide.Collection?.Any()??false
nous donnerafalse
si Collection est vide, etfalse
si Collection estnull
.Un complément de cela nous donnera
IsEmptyOrNull
.la source
La réponse de Jon Skeet ( https://stackoverflow.com/a/28904021/8207463 ) a une bonne approche en utilisant la méthode d'extension - Any () pour NULL et EMPTY. MAIS il valide le propriétaire des questions en cas de NOT NULL. Modifiez donc soigneusement l'approche de Jon pour valider AS NULL en:
NE PAS utiliser (ne validera pas AS NULL):
Vous pouvez également en cas de validation AS NOT NULL (PAS testé comme exemple mais sans erreur du compilateur) faire quelque chose comme utiliser le prédicat:
https://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs,8788153112b7ffd0
Pour quelle version .NET vous pouvez l'utiliser, veuillez vérifier:
https://docs.microsoft.com/en-us/dotnet/api/system.linq.enumerable.any?view=netframework-4.8#moniker-applies-to
la source
J'ai eu le même problème et je le résolve comme:
"c => c! = null" ignorera toutes les entités nulles.
la source
J'ai construit cela à partir du réponse de @Matt Greer
Il a parfaitement répondu à la question du PO.
Je voulais quelque chose comme ça tout en conservant les capacités d'origine de Any tout en vérifiant la valeur null. Je poste ceci au cas où quelqu'un d'autre aurait besoin de quelque chose de similaire.
Plus précisément, je voulais toujours pouvoir passer un prédicat.
La dénomination de la méthode d'extension pourrait probablement être meilleure.
la source
L'autre meilleure solution comme ci-dessous pour vérifier vide ou non?
la source
listEnumerable
est nul, ce qui est la question à portée de mainJ'utilise celui-ci:
Ejem:
la source
Étant donné que certaines ressources sont épuisées après une lecture, j'ai pensé pourquoi ne pas combiner les contrôles et les lectures, au lieu du contrôle séparé traditionnel, puis lire.
Tout d'abord, nous en avons un pour l'extension inline check-for-null plus simple:
Ensuite, nous avons l'extension en ligne un peu plus impliquée (enfin, du moins la façon dont je l'ai écrite): check-for-null-and-empty inline:
Vous pouvez bien sûr toujours appeler les deux sans continuer la chaîne d'appels. Aussi, j'ai inclus le paramName, de sorte que l'appelant puisse inclure un autre nom pour l'erreur si ce n'est pas "source" en cours de vérification, par exemple "nameof (target)".
la source
ma propre méthode d'extension pour vérifier Non nul et Any
la source
Sans assistants personnalisés, je recommande l'un
?.Any() ?? false
ou l' autre ou?.Any() == true
qui sont relativement concis et n'ont besoin de spécifier la séquence qu'une seule fois.Lorsque je veux traiter une collection manquante comme une collection vide, j'utilise la méthode d'extension suivante:
Cette fonction peut être combinée avec toutes les méthodes LINQ et
foreach
, pas seulement.Any()
, c'est pourquoi je la préfère aux fonctions d'assistance plus spécialisées que les gens proposent ici.la source
j'utilise
Le résultat sera nul si aucune correspondance, sinon retourne l'un des objets
Si vous vouliez la liste, je pense que quitter First () ou appeler ToList () fournira la liste ou null.
la source
Jetez un œil à cette bibliothèque Open Source : Nzr.ToolBox
la source
il suffit d'ajouter
using System.Linq
et de voir la magie se produire lorsque vous essayez d'accéder aux méthodes disponibles dans leIEnumerable
. L'ajout de cela vous donnera accès à une méthode nomméeCount()
aussi simple que cela. n'oubliez pas de vérifiernull value
avant d'appelercount()
:)la source
J'ai utilisé simple si pour le vérifier
regarde ma solution
la source