109 votes

Quelle est la difference entre List (of T) et Collection (of T)?

Je les ai vus utilisés de la même manière, et je crains d’être irréversible en matière de design si je ne comprends pas mieux cela. En outre, j'utilise .NET.

57voto

Adam Lassek Points 18918

Collection<T> personnalisable wrapper autour de IList<T>. Alors qu' IList<T> n'est pas scellé, il ne propose pas de personnalisation des points. Collection<T>'s méthodes sont par défaut des délégués à la norme IList<T> méthodes, mais peut être facilement remplacé à faire ce que vous voulez. Il est également possible de wireup événements à l'intérieur d'un Collection<T> que je ne crois pas pourrait être fait avec un IList.

En bref, c'est beaucoup plus facile de l'étendre après le fait, ce qui pourrait signifier beaucoup moins de refactoring.

44voto

Arnold Zokas Points 4086

List<T> est prévu pour une utilisation interne dans le code de l'application. Vous devriez éviter d'écrire des Api publiques que d'accepter ou de retour List<T> (tenir compte à l'aide d'une super-classe ou une interface de collecte de la place).

Collection<T> sert de classe de base pour des collections personnalisées (bien qu'il peut être utilisé directement).

Envisager l'utilisation d' Collection<T> dans votre code, sauf si il y a des caractéristiques spécifiques de l' List<T> que vous avez besoin.

Le ci-dessus sont juste des recommandations.

[Adapté de: - Cadre des lignes Directrices de Conception, Deuxième Édition]

37voto

Marc Gravell Points 482669

List<T> est très couramment vu conteneur, car il est très polyvalent (avec beaucoup de pratique, les méthodes comme Sort, Find, etc) - mais n'a pas de points d'extension si vous souhaitez remplacer l'un quelconque des comportements (cocher les éléments à insérer, par exemple).

Collection<T> est un wrapper autour de n'importe quel IList<T> (par défaut List<T>) - il a des points d'extension (virtual méthodes), mais pas comme beaucoup de méthodes de soutien, comme Find. En raison de l'indirection, il est un peu plus lent que d' List<T>, mais pas de beaucoup.

Avec LINQ, les méthodes supplémentaires en List<T> deviennent de moins en moins important, puisque LINQ-to-Objets tend à leur donner de toute façon... par exemple, First(pred), OrderBy(...), etc.

12voto

tuinstoel Points 6329

La liste est plus rapide.

Faire par exemple

 private void button1_Click(object sender, EventArgs e)
{
  Collection<long> c = new Collection<long>();
  Stopwatch s = new Stopwatch();
  s.Start();
  for (long i = 0; i <= 10000000; i++)
  {
    c.Add(i);
  }
  s.Stop();
  MessageBox.Show("collect " + s.ElapsedMilliseconds.ToString());

  List<long> l = new List<long>();
  Stopwatch s2 = new Stopwatch();
  s2.Start();
  for (long i = 0; i <= 10000000; i++)
  {
    l.Add(i);
  }
  s2.Stop();
  MessageBox.Show("lis " + s2.ElapsedMilliseconds.ToString());


}
 

sur ma machine, List<> est presque deux fois plus rapide.

modifier

Je ne comprends pas pourquoi les gens votent de moins en moins. Le code de la liste <> est 80% plus rapide sur ma machine de travail et sur ma machine personnelle.

11voto

Manu Points 10901

La liste représente une collection où l'ordre des éléments est important. Il prend également en charge les méthodes de tri et de recherche. La collecte est une structure de données plus générale qui suppose moins d'hypothèses sur les données et prend également en charge moins de méthodes pour les manipuler. Si vous souhaitez exposer une structure de données personnalisée, vous devriez probablement étendre la collection. Si vous avez besoin de manipuler des données sans exposer la structure de données, une liste est probablement le moyen le plus pratique.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X