Lorsque vous travaillez avec IEnumerable, le principe fondamental est celui de l'évaluation paresseuse, où les éléments ne sont récupérés qu'au fur et à mesure des besoins. Cependant, nous pouvons parfois nous retrouver dans une situation où nous avons besoin de connaître le nombre d'éléments de la collection sans les parcourir.
Considérez l'extrait de code suivant :
private IEnumerable<string> Tables { get { yield return "Foo"; yield return "Bar"; } }
Si nous souhaitez parcourir cette collection et afficher la progression sous la forme "traitement #n de #m", comment pouvons-nous déterminer la valeur de m sans itérer ?
Limitations de IEnumerable
Malheureusement, cela n'est pas possible avec IEnumerable. De par sa conception, il fonctionne paresseusement, ne produisant des éléments que sur demande. Déterminer le décompte total à l'avance nécessiterait un parcours initial, ce qui irait à l'encontre de l'objectif d'une évaluation paresseuse.
ICollection à la rescousse
S'il est crucial de connaître le décompte sans itération, considérez en utilisant ICollection à la place. ICollection est une interface qui représente des collections pouvant fournir des informations sur leur contenu. Il comprend une propriété Count qui renvoie le nombre d'éléments dans la collection.
private ICollection<string> Tables { get { return new List<string> { "Foo", "Bar" }; } } int count = Tables.Count;
En convertissant Tables en List
En conclusion, même si IEnumerable brille par son efficacité dans l'évaluation paresseuse, son manque d'informations de décompte à l'avance peut être une limitation. Pour les scénarios où il est impératif de connaître le décompte à l’avance, envisagez plutôt d’utiliser ICollection.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!