Si vous pouvez utiliser LINQ, vous pouvez utiliser:
var e = enumerable.First();
Cela lèvera une exception si enumerable est vide: auquel cas vous pouvez utiliser:
var e = enumerable.FirstOrDefault();
FirstOrDefault()
retournera default(T)
si l'énumérable est vide, ce qui sera null
pour les types référence ou la «valeur zéro» par défaut pour les types valeur.
Si vous ne pouvez pas utiliser LINQ, votre approche est techniquement correcte et n'est pas différente de la création d'un énumérateur à l'aide des méthodes GetEnumerator
et MoveNext
pour récupérer le premier résultat (cet exemple suppose que énumérable est un IEnumerable<Elem>
):
Elem e = myDefault;
using (IEnumerator<Elem> enumer = enumerable.GetEnumerator()) {
if (enumer.MoveNext()) e = enumer.Current;
}
Joel Coehoorn mentionné .Single()
dans les commentaires; cela fonctionnera également, si vous vous attendez à ce que votre énumérable contienne exactement un élément - cependant, il lèvera une exception s'il est vide ou plus grand qu'un élément. Il existe une SingleOrDefault()
méthode correspondante qui couvre ce scénario de la même manière que FirstOrDefault()
. Cependant, David B explique que cela SingleOrDefault()
peut toujours lever une exception dans le cas où l'énumérable contient plusieurs éléments.
Edit: Merci Marc Gravell d' avoir souligné que je dois me débarrasser de mon IEnumerator
objet après l'avoir utilisé - j'ai édité l'exemple non LINQ pour afficher le using
mot - clé pour implémenter ce modèle.
Juste au cas où vous utilisez .NET 2.0 et n'avez pas accès à LINQ:
Cela devrait faire ce que vous recherchez ... il utilise des génériques afin que vous puissiez obtenir le premier élément sur n'importe quel type IEnumerable.
Appelez ça comme ça:
Ou
Vous pouvez le modifier assez facilement pour imiter la méthode d'extension IEnumerable.ElementAt () de .NET 3.5:
Appelant ça comme ça:
Bien sûr , si vous n'avez accès à LINQ, alors il y a beaucoup de bonnes réponses déjà ... affiché
la source
Eh bien, vous n'avez pas spécifié la version de .Net que vous utilisez.
En supposant que vous ayez 3.5, une autre méthode est la méthode ElementAt:
la source
FirstOrDefault ?
la source
essaye ça
la source
Utilisez FirstOrDefault ou une boucle foreach comme déjà mentionné. Il faut éviter de récupérer manuellement un énumérateur et d'appeler Current. foreach supprimera votre énumérateur pour vous s'il implémente IDisposable. Lorsque vous appelez MoveNext et Current, vous devez le supprimer manuellement (si cela est possible).
la source
Si votre IEnumerable ne l'expose pas
<T>
et que Linq échoue, vous pouvez écrire une méthode à l'aide de la réflexion:la source
vous pouvez également essayer la version plus générique qui vous donne le ième élément
enumerable.ElementAtOrDefault (i));
J'espère que ça aide
la source