À moins que vous n'ayez simplement besoin d'un tableau pour répondre à d'autres contraintes, vous devriez utiliser ToList
. Dans la majorité des scénarios ToArray
allouera plus de mémoire que ToList
.
Les deux utilisent des tableaux pour le stockage, mais ToList
a une contrainte plus souple. Il faut que le tableau soit au moins aussi grand que le nombre d'éléments de la collection. Si le tableau est plus grand, cela ne pose pas de problème. En revanche, si le tableau est plus grand, cela ne pose pas de problème. ToArray
a besoin que la taille du tableau corresponde exactement au nombre d'éléments.
Pour répondre à cette contrainte ToArray
fait souvent une allocation de plus que ToList
. Une fois qu'il dispose d'un tableau suffisamment grand, il alloue un tableau ayant exactement la bonne taille et recopie les éléments dans ce tableau. Le seul cas où il peut éviter cela est celui où l'algorithme de croissance du tableau coïncide avec le nombre d'éléments devant être stockés (ce qui est certainement minoritaire).
EDITAR
Quelques personnes m'ont interrogé sur les conséquences de la présence d'une mémoire supplémentaire inutilisée dans le système d'exploitation. List<T>
valeur.
Il s'agit d'une préoccupation légitime. Si la collection créée a une longue durée de vie, n'est jamais modifiée après sa création et a de fortes chances d'atterrir dans le tas Gen2, il est préférable d'utiliser l'allocation supplémentaire de ToArray
en amont.
En général, je trouve que c'est le cas le plus rare. Il est beaucoup plus courant de voir beaucoup de ToArray
qui sont immédiatement transmis à d'autres utilisations de courte durée de la mémoire. ToList
est manifestement meilleure.
L'essentiel est d'établir des profils, des profils et encore des profils.
11 votes
Si vous souhaitez découvrir ce qui se passe derrière les rideaux en .NET, je vous recommande vivement .NET Reflector
34 votes
@DavidHedlund Je recommande Code source .net .
1 votes
Je ne suis pas d'accord avec le fait que stackoverflow.com/questions/6750447/c-toarray-performance fait double emploi avec cette question, même s'il existe un lien important entre les deux. L'utilisation de la mémoire (cette question) et les performances (l'autre question) sont des considérations intéressantes et non négligeables. Elles peuvent être décrites séparément, mais elles doivent toutes deux entrer en ligne de compte dans la décision de choisir l'une plutôt que l'autre. Je ne peux recommander aucune des réponses à cette question ou à l'autre comme étant exhaustive. Il y a plusieurs réponses qui, prises ensemble, fournissent une discussion assez complète sur la façon de choisir l'une ou l'autre.