Le problème que le PO essaie d'aborder est que Count()
devra utiliser l'énumérateur pour MoveNext()
à travers l'ensemble IEnumerator
collection. L'avantage de IEnumerable est que nous devrions être en mesure d'arrêter l'énumération lorsque nous atteignons un certain prédicat d'informations connues.
Le problème que j'ai souligné avec les autres réponses est que null
est une valeur valide dans n'importe quelle collection. Ainsi, pour vérifier si GetElementAt...()
es null
n'est pas fiable.
J'ai une mise en œuvre et une exigence différentes, mais je l'ai modifiée pour ajouter une réponse à cette question spécifique :
public bool TryElementAtOrDefault<T>(IEnumerable<T> source, int index, out T value)
{
value = default;
if (index < 0 || source == null || source.Any() == false) return false;
if (source is IList<T> list && index < list.Count)
{
value = list[index];
return true;
}
using (var e = source.GetEnumerator())
{
while (e.MoveNext())
{
if (index == 0)
{
value = e.Current;
return true;
}
index--;
}
}
return false;
}