2010-03-30 5 views
5

Consultez le code suivant:Efficacité: Créer un tableau de doubles de façon incrémentielle?

List<double> l = new List<double>(); 

//add unknown number of values to the list 
l.Add(0.1); //assume we don't have these values ahead of time. 
l.Add(0.11); 
l.Add(0.1); 

l.ToArray(); //ultimately we want an array of doubles 

ya un problème avec cette approche? Existe-t-il un moyen plus approprié de construire un tableau, sans connaître la taille ou les éléments à l'avance?

Répondre

8

Votre approche ne pose aucun problème. Vous utilisez le type de données correct pour le but.

+0

Je sais que cette question est ancienne, et je peux me tromper à ce sujet, mais il me semble que l'OP posait des questions à propos de l'instruction 'l.ToArray();', comme je l'ai également demandé.S'il doit créer une toute nouvelle structure de données, puis copier toutes les données et détruire l'original, ce n'est en fait pas si efficace. Il serait significativement plus efficace de retourner la 'Liste ' ou tout autre type de données qui n'a pas besoin d'être copié et converti. –

-1

Une structure de données dynamique comme une liste est la manière correcte de l'implémenter. Les seules baies d'avantages réels sur une liste sont les performances d'accès O (1) (comparées à O (n) dans List). La flexibilité fait plus que compenser cette perte de performance imho

+4

La liste est O (1) pour accéder - en interne, c'est un tableau qui se développe dynamiquement en taille. –

+1

Liste <> n'est pas une liste liée. – ima

+0

Je suis corrigé et éduqué! –

3

Après quelques observations, vous pouvez avoir une meilleure idée du nombre total d'éléments dans cette liste. Ensuite, vous pouvez créer une nouvelle liste avec une capacité initiale dans le constructeur:

List<double> l = new List<double>(capacity); 

Autre que cela, il est la bonne technique et de la structure des données.


MISE À JOUR:

Si vous:

  • besoin que des Add et ToArray fonctions de la structure List<T>,
  • Et vous ne pouvez pas vraiment prédire la capacité totale
  • Et vous vous retrouvez avec plus de 1K éléments
  • et une meilleure performance est vraiment vraiment (vraiment!) Votre objectif

Ensuite, vous pouvez écrire votre propre interface:

public interface IArrayBuilder<T> 
{ 
    void Add(T item); 
    T[] ToArray(); 
} 

Et puis écrire votre propre implémentation, ce qui pourrait être mieux que List<T>. Pourquoi donc? car List<T> contient un seul tableau en interne et augmente sa taille lorsque cela est nécessaire. La procédure d'augmentation de la matrice interne coûte, en termes de performance, puisqu'elle alloue de la nouvelle mémoire (et peut-être copie les éléments de l'ancien tableau vers le nouveau, je ne m'en souviens pas). Cependant, si toutes les conditions décrites ci-dessus sont vraies, tout ce dont vous avez besoin est de construire un tableau, vous n'avez pas vraiment besoin que toutes les données soient stockées dans un seul tableau en interne.

Je sais qu'il est un long shot, mais je pense qu'il vaut mieux le partage de telles pensées ...

0

Comme d'autres l'ont déjà souligné: C'est la bonne approche. Je vais juste ajouter que si vous pouvez en quelque sorte éviter le tableau et utiliser List<T> directement ou peut-être IEnumerable<T>, vous éviterez de copier le tableau car ToArray copie réellement le tableau interne de l'instance de la liste.

Eric Lippert a un grand post about arrays, que vous pouvez trouver pertinent.

Questions connexes