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.
Réponses
Trop de publicités?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.
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]
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.
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.
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.