6
votes

Liste Structure de données C # Efficacité

Au moment où j'utilise une liste comme tampon pour contenir des objets pendant un moment pendant que un calcul est effectué à chaque valeur en fonction des autres valeurs plus poussées du tampon. J'ai ensuite réalisé que cela n'était probablement pas très efficace comme on m'a dit que Liste <> est une liste liée à chaque fois que je fais autre = myList [100]; La pauvre chose est d'avoir à sauter d'abord tous les autres nœuds pour arriver à la valeur que je veux. Je ne veux pas utiliser un tableau régulier car j'ai des charges de ajoutez () et supprimer () s Botter dans d'autres endroits dans le code. J'ai donc besoin d'une classe qui hérite ilist mais utilise une structure de données de tableau régulière. Est-ce que quelqu'un connaît une classe dans .net qui fonctionne de cette façon donc je n'ai pas à écrire le mien? J'ai essayé d'utiliser des arraylist mais il n'est pas générique!


4 commentaires

Honnêtement, je ne pense pas que vous allez devoir trop insister sur l'efficacité. Tous les gains que vous obtenez seront à peine perceptibles


Liste <> n'est pas une liste liée. LinkedList <> est cependant. Vous auriez pu remarquer que parce que cela n'a aucun sens d'exposer un accès aléatoire dans une liste liée.


L'accès indexé à une liste est O (1) opération.


lol je n'ai pas remarqué la classe LinkedList!


4 Réponses :


9
votes

Liste n'utilise pas de mise en œuvre de la liste liée. En interne, il utilise un tableau, il semble donc d'être exactement ce dont vous avez besoin. Notez que, parce que c'est un tableau, la suppression / l'insertion peut être une opération coûteuse en fonction de la taille de la liste et de l'élément de position enlevé / inséré - O (n). Sans savoir comment vous l'utilisez, cependant, il est difficile de recommander une meilleure structure de données.

citating de la section Remarques du docs .

La liste de liste (t) est l'équivalent générique de la classe ArrayList. Il met en œuvre l'interface générique ilon (T) à l'aide d'une matrice dont la taille est augmentée de manière dynamique au besoin.


0 commentaires

1
votes

Non, une liste est une collection générique, pas une liste liée. Si vous avez besoin d'ajouter et de supprimer des fonctionnalités, alors Liste est la mise en œuvre la plupart des personnes par défaut.


4 commentaires

Ok, merci mon idée qu'une liste <> est une liste liée était fausse :(


Si tel est le cas, il y a une raison quelconque de l'utilisation d'un tableau régulier sur la liste?


Pour la simplicité lorsque vous ne faites que traiter avec un numéro fixe et une collection d'objets


"Optimisé" est un peu une blague: p. La matrice interne de la liste est initialement attribuée à 4 éléments, et chaque fois que sa capacité est dépassée, une nouvelle matrice est attribuée avec le double de la taille précédente - et son contenu est copié sur. Ce n'est évidemment pas le meilleur conteneur pour ajouter - il est simplement plus simple d'écrire que des tableaux en expansion manuelle. La liste <> est l'analogue d'un C ++ std :: vecteur <>.



3
votes

Liste est sauvegardé par une matrice, pas une liste liée. Accès indexé d'une liste se produit en temps constant.


0 commentaires

3
votes

En plus de la réponse correcte de Tvanfosson, si vous ne savez jamais comment quelque chose fonctionne en interne, chargez simplement le . Réflecteur net et vous pouvez voir exactement comment les choses sont implémentées. Dans ce cas, la perturation de l'indexeur de la liste nous montre le code suivant: xxx

où vous pouvez voir que this._items [ Index] est une matrice du type générique t .


1 commentaires

Parce que le réflecteur n'est plus libre, iLspy et DotPeek sont d'autres alternatives gratuites.