La méthode "First" fait probablement avancer l'itérateur pour qu'il pointe sur le deuxième élément. Votre premier appel à "Count" termine alors l'itération sur votre séquence d'un élément, et l'appel suivant à Count recommence l'itération. Count itérera toujours la séquence entière, il est donc idempotent. Vous devez trouver un moyen de réinitialiser l'énumérateur. Hotels.Reset()
après First()
de faire Count()
se comportent correctement.
Le plus simple serait sans doute de faire un Reset
vous-même, mais je ne peux pas reproduire votre problème. Si vous avez un itérateur de base de données généré par le système, il est possible qu'il ne soit pas réinitialisé automatiquement et vous pourriez utiliser le code ci-dessous. Il s'agit simplement d'utiliser votre propre constatation qu'un simple Count()
réinitialise l'itérateur. Et ce serait O(n)
à compléter.
static class Extensions
{
public static void Reset<T>(this IEnumerable<T> toReset )
{
if (toReset != null)
{
int i = toReset.Count();
}
}
}
Mais je ne peux pas reproduire votre problème :
Le code ci-dessous donne le résultat correct partout. Avez-vous écrit votre propre énumérateur ou collection ?
static void Main(string[] args)
{
var Response = System.Console.Out;
var Hotels = new[]{1, 2, 3, 4};
var Hotel = 0;
Response.Write("RES " + Hotels.Count() + "<br />");
if (Hotels.Count() > 0)
{
Hotel = Hotels.First();
}
Response.Write("RES " + Hotels.Count() + "<br />");
Response.Write("RES " + Hotels.Count() + "<br />");
Console.WriteLine( "Hotel: " + Hotel);
}