<p>A moins que vous n’ayez simplement besoin d’un tableau pour satisfaire d’autres contraintes, vous devriez utiliser <code>ToList</code>. Dans la majorite des scenarios, <code>ToArray</code> allouera plus de memoire que <code>ToList</code>.</p>
<p>Les deux utilisent des tableaux pour le stockage, mais <code>ToList</code> 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, <code>ToArray</code> a besoin que le tableau soit dimensionne exactement au nombre d’elements.</p>
<p>Pour satisfaire cette contrainte, <code>ToArray</code> effectue souvent une allocation de plus que <code>ToList</code>. 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).</p>
<p><strong>EDIT</strong></p>
<p>Plusieurs personnes nous ont interroge sur les consequences d’avoir de la memoire inutilisee supplementaire dans la valeur <code>List<T></code>.</p>
<p>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 <code>ToArray</code> des le depart.</p>
<p>En general cependant, nous trouvons que c’est le cas le plus rare. Il est beaucoup plus courant de voir de nombreux appels <code>ToArray</code> qui sont immediatement passes a d’autres utilisations de memoire de courte duree, auquel cas <code>ToList</code> est manifestement meilleur.</p>
<p>La cle ici est de profiler, profiler et encore profiler.</p>