Comment puis-je obtenir le premier élément à partir d'un IEnumerable<T> dans .net?
J'ai souvent envie de prendre le premier élément d'un IEnumerable<T>
dans .net, et je n'ai pas trouvé une belle façon de le faire. Le meilleur que j'ai trouvé est:
foreach(Elem e in enumerable) {
//do something with e
break;
}
Beurk! Alors, est-il un bon moyen de faire cela?
Vous devez vous connecter pour publier un commentaire.
Si vous pouvez utiliser LINQ, vous pouvez utiliser:
Cela va lever une exception si énumérable est vide: dans ce cas vous pouvez utiliser:
FirstOrDefault()
sera de retourdefault(T)
si l'énumération est vide, ce qui seranull
pour les types référence ou la valeur par défaut "zéro valeur" pour les types de valeur.Si vous ne pouvez pas utiliser LINQ, votre approche est techniquement correcte et à la création d'un agent recenseur à l'aide de la
GetEnumerator
etMoveNext
méthodes pour récupérer le premier résultat (cet exemple suppose énumérable est unIEnumerable<Elem>
):Joel Coehoorn mentionné
.Single()
dans les commentaires; il travaillera aussi, si vous attendez votre énumérable pour contenir exactement un élément, cependant, il va lever une exception si elle est vide ou ayant plus d'un élément. Il y a un correspondantSingleOrDefault()
méthode qui couvre ce scénario d'une manière similaire àFirstOrDefault()
. Cependant, David B explique queSingleOrDefault()
peut encore lever une exception dans le cas où l'énumération contient plus d'un élément.Edit: Merci Marc Gravel pour préciser que j'ai besoin de disposer de ma
IEnumerator
objet après utilisation - j'ai édité le non-LINQ exemple pour afficher lesusing
mot-clé pour mettre en œuvre ce modèle.using
enumer - mais d'autres que cela, bon ;-pusing System.Linq;
ok maintenant ça fonctionne!Juste au cas où vous êtes en utilisant .NET 2.0 et n'ont pas accès à LINQ:
Cela devrait faire ce que vous cherchez...il utilise des génériques, de sorte que vous obtenez le premier élément sur n'importe quel type IEnumerable.
L'appeler de la sorte:
Ou
Vous pouvez modifier facilement assez pour imiter .NET 3.5 de l'interface IEnumerable.ElementAt() la méthode d'extension:
De l'appeler comme ceci:
Bien sûr, si vous ne avoir accès à LINQ, puis il ya beaucoup de bonnes réponses posté déjà...
using
iterBien, vous n'avez pas à spécifier la version de .Net vous utilisez.
En supposant que vous avez 3.5, une autre voie est la ElementAt méthode:
FirstOrDefault ?
Utilisation FirstOrDefault ou une boucle foreach, comme déjà mentionné. Manuellement extraction d'un agent recenseur et de l'appel de Courant doit être évitée. foreach va disposer de votre agent recenseur pour vous si elle met en œuvre IDisposable. Lors de l'appel de la méthode MoveNext et Actuelle, vous devez éliminer manuellement (si applicable).
Si votre IEnumerable ne pas exposer c'est
<T>
et Linq échoue, vous pouvez écrire une méthode à l'aide de la réflexion:essayer cette
vous pouvez également essayer le plus générique de la version qui vous donne le i-ème élément
énumérable.ElementAtOrDefault(i));
espère que cela aide