web-dev-qa-db-fra.com

quelle est la différence entre un tableau de chaînes et une liste de chaînes en c #

J'entends sur MSDN qu'un tableau est plus rapide qu'une collection.

Pouvez-vous me dire comment string[] est plus rapide que List<string>.

42
user605334

Les tableaux sont une abstraction de niveau inférieur à des collections telles que des listes. Le CLR connaît directement les tableaux, il y a donc un peu moins de travail impliqué dans l'itération, l'accès, etc.

Cependant, cela ne devrait presque jamais dicter ce que vous utilisez réellement. La différence de performances sera négligeable dans la plupart des applications du monde réel. Je trouve rarement approprié d'utiliser des tableaux plutôt que les diverses classes de collection génériques, et en effet certains considèrent tableaux quelque peu dangereux . Un inconvénient majeur est qu'il n'existe pas de tableau immuable (autre qu'un tableau vide) ... alors que vous pouvez exposer des collections en lecture seule via une API relativement facilement.

50
Jon Skeet

L'article date de 2004, cela signifie qu'il s'agit de . Net 1.1 et qu'il n'y avait pas de génériques. Les performances de la baie par rapport à la collection étaient en fait un problème à l'époque, car les types de collection provoquaient de nombreuses opérations d'exta boxing-unboxing. Mais depuis .net 2.0, où les génériques ont été introduits, les différences de performances ont presque disparu.

9
bniwredyc

Un tableau n'est pas redimensionnable. Cela signifie que lors de sa création, un bloc de mémoire est alloué, suffisamment grand pour contenir autant d'éléments que vous spécifiez.

Un List d'autre part est implicitement redimensionnable. Chaque fois que vous Add un élément, le framework peut avoir besoin d'allouer plus de mémoire pour contenir l'élément que vous venez d'ajouter. C'est une opération coûteuse, donc nous finissons par dire "La liste est plus lente que le tableau".

Bien sûr, c'est une explication très simplifiée, mais avec un peu de chance, pour peindre l'image.

6
Jon

Un tableau est la forme de collection la plus simple, il est donc plus rapide que les autres collections. Une liste (et de nombreuses autres collections) utilise en fait un tableau en interne pour contenir ses éléments.

Un tableau est bien sûr également limité par sa simplicité. Plus particulièrement, vous ne pouvez pas modifier la taille d'un tableau. Si vous voulez une collection dynamique, vous utiliserez une liste.

3
Guffa

List<string> est une classe avec un membre privé qui est un string[]. La documentation MSDN indique ce fait à plusieurs endroits. La classe List est essentiellement une classe wrapper autour d'un tableau qui donne au tableau d'autres fonctionnalités.

La réponse qui est la plus rapide dépend de ce que vous essayez de faire avec la liste/le tableau. Pour accéder et affecter des valeurs aux éléments, le tableau est probablement beaucoup plus rapide car la liste est une abstraction du tableau (comme l'a dit Jon Skeet).

Si vous avez l'intention d'avoir une structure de données qui grandit avec le temps (obtient de plus en plus d'éléments), les performances (vitesse moyenne) sage la liste commencera à briller. En effet, chaque fois que vous redimensionnez un tableau pour ajouter un autre élément, il s'agit d'une opération O(n). Lorsque vous ajoutez un élément à une liste (et que la liste est déjà à pleine capacité), la liste va doubler de taille. Je n'entrerai pas dans les détails, mais cela signifie essentiellement que l'augmentation de la taille d'une liste est en moyenne une opération O (log n). Bien sûr, cela présente aussi des inconvénients (vous pourriez avoir presque deux fois la quantité de mémoire allouée dont vous avez vraiment besoin si vous ne dépassez que quelques éléments au-delà de sa dernière capacité).

Edit: je me suis un peu mélangé dans le paragraphe ci-dessus. Comme Eric l'a dit ci-dessous, le nombre de redimensionnements pour une liste est O (log n), mais le coût réel associé au redimensionnement du tableau est amorti à O (1).

3
Jason Moore