Collection<T>
настраиваемая обертка [приблизительно 111]. В то время как IList<T>
не изолируется, это не обеспечивает точек настройки. Collection<T>
методы по умолчанию делегированы к стандарту IList<T>
методы, но могут быть легко переопределены, чтобы сделать то, что Вы хотите. Это также возможно к wireup событиям в Collection<T>
, что я не верю, мог быть сделан с IList.
Короче говоря, намного легче расширить его после факта, который мог потенциально означать намного меньше рефакторинга.
List<T>
очень обычно замечаемый контейнер, потому что это так очень универсально (с большим количеством удобных методов как Sort
, Find
, и т.д.) - но не имеет никаких точек расширения, если Вы хотите переопределить какое-либо поведение (начните работу, объекты вставляют, например).
Collection<T>
обертка вокруг любого IList<T>
(принимающий значение по умолчанию к List<T>
) - она имеет точки расширения (virtual
методы), но не как много методов поддержки как Find
. Из-за косвенности это немного медленнее, чем List<T>
, но не очень.
С LINQ, дополнительные методы в List<T>
становятся менее важными, так как LINQ к объектам имеет тенденцию обеспечивать их так или иначе..., например First(pred)
, OrderBy(...)
, и т.д.
Это - один из тех вопросов о школе градиента. Набор T является видом краткого обзора; может быть реализация по умолчанию (я не .net/c# парень), а набор начнет основные операции, любят, добавляют, удаляют, выполняют итерации, и так далее.
Список T подразумевает некоторые специфические особенности об этих операциях: добавьте должен занять время, удалить, должен занять время пропорциональный числу элементов, getfirst должен быть временем согласия. В целом Списком является своего рода Набор, но Набором является не обязательно своего рода Список.
Список представляет набор, где порядок пунктов важен. Это также поддерживает методы s.a. Вид и поиск. Набор является более общей структурой данных, которая делает меньше предположений о данных и также поддерживает меньше методов для управления ими. Если Вы хотите представить пользовательскую структуру данных, необходимо, вероятно, расширить набор. Если необходимо управлять данными w/o представление структуры данных, список является, вероятно, более удобным способом пойти.
Hanselman Говорит : "Collection<T>
похож на список, и он даже имеет List<T>
внутренне. Каждый метод делегирует к внутреннему List<T>
. Это включает защищенное свойство, которое представляет List<T>
".
РЕДАКТИРОВАНИЕ: Collection<T>
не существует в Системе. Универсальный..NET наборов 3.5. Если Вы мигрируете от.NET 2.0 к 3,5, то необходимо будет изменить некоторый код при использовании большого количества из Collection<T>
объекты если я не пропускаю что-то очевидное...
РЕДАКТИРОВАНИЕ 2: Collection<T>
находится теперь в Системе. Наборы. Пространство имен ObjectModel в.NET 3.5. Справочный файл говорит это:
"Система. Наборы. Пространство имен ObjectModel содержит классы, которые могут использоваться в качестве наборов в объектной модели допускающей повторное использование библиотеки. Используйте эти классы, когда свойства или методы возвратят наборы".
Оба реализуют те же интерфейсы, таким образом, они будут вести себя тот же путь. Возможно, они реализованы по-другому внутренне, но это должно было бы быть протестировано.
единственными реальными различиями, которые я вижу, являются пространства имен и то, которое Collection<T>
отмечено с ComVisibleAttribute(false)
, таким образом, код COM не может использовать его.
Список быстрее.
Делают, например
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());
}
на моей машине List<>
, почти вдвое более быстро.
Редактирование
я не могу понять, почему люди являются downvoting это. И на моей машине работы и на моей домашней машине List<> код на 80% быстрее.
List<T>
предназначается для внутреннего пользования в коде приложения. Необходимо постараться не писать общедоступные API, которые принимают или возвращаются List<T>
(рассмотрите использование суперкласса или интерфейса набора вместо этого).
Collection<T>
подачи базовый класс для пользовательских наборов (хотя это может использоваться непосредственно).
Рассматривают использование Collection<T>
в Вашем коде, если нет определенные функции List<T>
, что Вам нужно.
Вышеупомянутое просто рекомендации.
[Адаптированный от: Руководство по проектированию Платформы, Второй Выпуск]