Question

Supposons que je veuille accéder à un objet d'un Collection, et je veux être sûr il n'itérer pas par l'ensemble Collection juste pour déterminer la taille.

Comment puis-je déterminer et contrôle si un appel aux résultats de Count à itérer fait que la collection? (Autre que d'utiliser ma propre mise en œuvre de ICollection), autrement dit là-bas sont des implémentations qui offrent ce?

public void PrintThreeNames(ICollection<string> names)
{
    //first I want to know if the collection has at least three elements.
    if (names != null && names.Count >= 3)
    {
        IEnumerator<string> enumerator = names.GetEnumerator();
        string value0 = enumerator.Current;
        enumerator.MoveNext();
        string value1 = enumerator.Current;
        enumerator.MoveNext();
        string value2 = enumerator.Current;
        //print values.
        Console.Writeline(value0 + value1 + value2);
    }
}

En réponse à la question des programmeurs de héros. Je suppose que je peux faire une collection de IEnumerable<T> ajouter un million de documents, et compter pour voir à quelle vitesse un appel à Count est aussi bien.

Je pose cette question car je peux choisir à l'aide IEnumerable sur Collection, que mes collections sont si importantes en nombre et les données par élément ainsi, que ce sera un problème pour revenir tous à la fois.

Cependant, je voudrais connaître les inconvénients de IEnumarable ainsi, Joshua a sur le verrouillage, il est pas une bonne idée, dans une autre question.

Était-ce utile?

La solution

Parce que ICollection expose comme une propriété Count, il doit être sûr de supposer qu'il est vraiment pas cher pour obtenir sa valeur (à-dire qu'elle ne doit pas itérer à travers toute la collection).

Ceci est juste une des meilleures pratiques propriétés environnantes - obtenir leurs valeurs devrait être pas cher -. Période

Si l'opération est coûteuse, alors il devrait être une méthode - par exemple Count ().

Bien sûr, quelqu'un pourrait certainement fournir une implémentation coûteuse de ICollection.Count - mais cette personne ne fait pas les choses.

Si le calcul du nombre d'éléments est coûteux, ils devraient mettre en œuvre que IEnumerable -. Pas ICollection

Autres conseils

Y at-il des implémentations de Count qui sont relativement coûteux? Probablement, mais ils seront rares; les classes .NET Framework sont réglés pour assez bonne efficacité tous azimuts.

Est-il important? Presque certainement pas. À moins que vous interrogez Count millions de fois collections avec des millions d'éléments, la différence est si faible qu'il est hors de propos:

  • 100 millions d'appels à List<T>.Count contenant 1 million d'entiers: 0,85S
  • 100 millions d'appels à HashSet<T>.Count() contenant 1 million d'entiers: 1.45s

Techniquement, car ICollection est une interface vous avez aucune garantie que ce ne sera pas itérer dans la collection. L'interface peut être mise en œuvre de toute façon.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top