Question

Quel est le meilleur/meilleure façon d'obtenir un nombre d'éléments dans une collection IEnumerable sans que l'énumération de tous les éléments de la collection?

Possible avec LINQ ou Lambda?

Était-ce utile?

La solution

Vous devez énumérer d'obtenir un décompte.D'autres éléments, comme la Liste de maintenir un comte.

Autres conseils

La solution dépend de pourquoi vous ne voulez pas vous énumérer la collection.

Si c'est parce que l'énumération de la collection peut être lent, alors il n'y a pas de solution qui sera la plus rapide.Vous pouvez envisager d'utiliser un ICollection à la place, si possible.À moins que l'énumération est remarquablement lente (par exemple,il lit les articles du disque), la vitesse ne devrait pas être un problème.

Si c'est parce que l'énumération de la collection aura besoin de plus de code alors qu'il a déjà été écrit pour vous sous la forme de l' .Comte (le) de la méthode d'extension.Utilisez simplement MyEnumerable.Count().

Si c'est parce que vous voulez être en mesure d'énumérer la collecte après que vous avez compté alors la .Comte (le) de la méthode d'extension permet de faire cela.Vous pouvez même appeler .Count() sur une collection vous êtes dans le milieu de l'énumération et il portera sur de l'endroit où il était avant le comptage.Par exemple:

foreach (int item in Series.Generate(5))
{
    Console.WriteLine(item + "(" + myEnumerable.Count() + ")");
}

donnera les résultats

0 (5)

1 (5)

2 (5)

3 (5)

4 (5)

Si c'est parce que l'énumération a des effets secondaires (par ex.les écritures sur le disque/de la console) ou est personne à charge sur les variables qui peuvent changer entre le comptage et l'énumération (par ex.lit à partir du disque) [N. B.Si possible, je suggère de repenser l'architecture, car cela peut causer beaucoup de problèmes] alors une possibilité à envisager est la lecture de l'énumération dans un intermittent de stockage.Par exemple:

List<int> seriesAsList = Series.Generate(5).ToList();

Tous les ci-dessus suppose que vous ne pouvez pas modifier le type (c'est à direil est retourné à partir d'une bibliothèque que vous ne possédez pas).Si possible, vous pourriez envisager de changer d'utiliser une ICollection ou IList (ICollection de plus en plus largement l'étendue de IList) qui a un Comte de propriété sur elle.

Dans tous les cas, vous devez effectuer une boucle à travers elle.Linq offre la Count méthode:

var result = myenum.Count();

L'utilisation de ce.

IEnumerable list =..........;

list.OfType<T>().Count()

il sera de retour le comte.

Il y a aussi IList ou ICollection, si vous souhaitez utiliser un concept qui est encore un peu souple, mais a également la fonctionnalité dont vous avez besoin.Ils ont tous deux impliquent IEnumerable.

Elle dépend aussi de ce que vous voulez atteindre par comptage..Si vous êtes intéressé à trouver si l'énumérable collection a tous les éléments, vous pouvez utiliser

myEnumerable.Tout() sur myEnumerable.Count() où les anciens donnera le premier élément et le plus tard sera le rendement de tous les éléments.

Un IEnumerable auront à parcourir chaque élément.pour obtenir le dénombrement complet.Si vous avez juste besoin de vérifier s'il existe un ou plusieurs éléments dans un IEnumerable la méthode la plus efficace est de vérifier si il y a de tout.Tout() la case de voir qu'il ya une valeur et ne tourne pas en boucle à travers tout.

IEnumerable myStrings = new Liste(){"un","deux", "trois"};

bool hasValues = myStrings.Tout();

Pas possible avec LINQ, comme l'appel .Count(...) ne énumérer la collection.Si vous êtes en cours d'exécution dans le problème où vous ne pouvez pas parcourir une collection deux fois, essayez ceci:

List<MyTableItem> myList = dataContext.MyTable.ToList();
int myTableCount = myList.Count;

foreach (MyTableItem in myList)
{
   ...
}

Si vous avez besoin de compter et puis la boucle, vous pouvez être mieux avec une liste.

Si vous utilisez le comte de vérifier pour les membres, vous pouvez utiliser Any() pour éviter l'énumération de l'ensemble de la collection.

La meilleure solution je pense est de faire ce qui suit:

  1. en utilisant le Système.Linq.Dynamique;
  2. myEnumerable.AsQueryable().Count()
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top