Est-il preferable d'appeler ToList() ou ToArray() dans les requetes LINQ ?

Est-il preferable d’appeler ToList() ou ToArray() dans les requetes LINQ ?

A moins que vous n’ayez simplement besoin d’un tableau pour satisfaire d’autres contraintes, vous devriez utiliser ToList. Dans la majorite des scenarios, ToArray allouera plus de memoire que ToList.

Les deux utilisent des tableaux pour le stockage, mais ToList a une contrainte plus flexible. Il a besoin que le tableau soit au moins aussi grand que le nombre d’elements dans la collection. Si le tableau est plus grand, ce n’est pas un probleme. Cependant, ToArray a besoin que le tableau soit dimensionne exactement au nombre d’elements.

Pour satisfaire cette contrainte, ToArray effectue souvent une allocation de plus que ToList. Une fois qu’il a un tableau suffisamment grand, il alloue un tableau qui a exactement la bonne taille et copie les elements dans ce tableau. Le seul cas ou il peut eviter cela est lorsque l’algorithme de croissance du tableau coincide exactement avec le nombre d’elements a stocker (ce qui est definitivement minoritaire).

EDIT

Plusieurs personnes nous ont interroge sur les consequences d’avoir de la memoire inutilisee supplementaire dans la valeur List<T>.

C’est une preoccupation valide. Si la collection creee est destinee a vivre longtemps, n’est jamais modifiee apres sa creation et a de fortes chances de se retrouver dans le tas Gen2, alors vous feriez peut-etre mieux de prendre l’allocation supplementaire de ToArray des le depart.

En general cependant, nous trouvons que c’est le cas le plus rare. Il est beaucoup plus courant de voir de nombreux appels ToArray qui sont immediatement passes a d’autres utilisations de memoire de courte duree, auquel cas ToList est manifestement meilleur.

La cle ici est de profiler, profiler et encore profiler.