Каково различие между Списком (T) и Набором (T)?

87
задан Anthony Potts 29 December 2008 в 22:53
поделиться

8 ответов

Collection<T> настраиваемая обертка [приблизительно 111]. В то время как IList<T> не изолируется, это не обеспечивает точек настройки. Collection<T> методы по умолчанию делегированы к стандарту IList<T> методы, но могут быть легко переопределены, чтобы сделать то, что Вы хотите. Это также возможно к wireup событиям в Collection<T>, что я не верю, мог быть сделан с IList.

Короче говоря, намного легче расширить его после факта, который мог потенциально означать намного меньше рефакторинга.

49
ответ дан Adam Lassek 5 November 2019 в 15:19
поделиться

List<T> очень обычно замечаемый контейнер, потому что это так очень универсально (с большим количеством удобных методов как Sort, Find, и т.д.) - но не имеет никаких точек расширения, если Вы хотите переопределить какое-либо поведение (начните работу, объекты вставляют, например).

Collection<T> обертка вокруг любого IList<T> (принимающий значение по умолчанию к List<T>) - она имеет точки расширения (virtual методы), но не как много методов поддержки как Find. Из-за косвенности это немного медленнее, чем List<T>, но не очень.

С LINQ, дополнительные методы в List<T> становятся менее важными, так как LINQ к объектам имеет тенденцию обеспечивать их так или иначе..., например First(pred), OrderBy(...), и т.д.

37
ответ дан Marc Gravell 5 November 2019 в 15:19
поделиться

Это - один из тех вопросов о школе градиента. Набор T является видом краткого обзора; может быть реализация по умолчанию (я не .net/c# парень), а набор начнет основные операции, любят, добавляют, удаляют, выполняют итерации, и так далее.

Список T подразумевает некоторые специфические особенности об этих операциях: добавьте должен занять время, удалить, должен занять время пропорциональный числу элементов, getfirst должен быть временем согласия. В целом Списком является своего рода Набор, но Набором является не обязательно своего рода Список.

4
ответ дан Charlie Martin 5 November 2019 в 15:19
поделиться

Список представляет набор, где порядок пунктов важен. Это также поддерживает методы s.a. Вид и поиск. Набор является более общей структурой данных, которая делает меньше предположений о данных и также поддерживает меньше методов для управления ими. Если Вы хотите представить пользовательскую структуру данных, необходимо, вероятно, расширить набор. Если необходимо управлять данными w/o представление структуры данных, список является, вероятно, более удобным способом пойти.

11
ответ дан Manu 5 November 2019 в 15:19
поделиться

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 содержит классы, которые могут использоваться в качестве наборов в объектной модели допускающей повторное использование библиотеки. Используйте эти классы, когда свойства или методы возвратят наборы".

4
ответ дан Tad Donaghe 5 November 2019 в 15:19
поделиться

Оба реализуют те же интерфейсы, таким образом, они будут вести себя тот же путь. Возможно, они реализованы по-другому внутренне, но это должно было бы быть протестировано.

единственными реальными различиями, которые я вижу, являются пространства имен и то, которое Collection<T> отмечено с ComVisibleAttribute(false), таким образом, код COM не может использовать его.

3
ответ дан OwenP 5 November 2019 в 15:19
поделиться

Список быстрее.

Делают, например

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% быстрее.

12
ответ дан tuinstoel 5 November 2019 в 15:19
поделиться

List<T> предназначается для внутреннего пользования в коде приложения. Необходимо постараться не писать общедоступные API, которые принимают или возвращаются List<T> (рассмотрите использование суперкласса или интерфейса набора вместо этого).

Collection<T> подачи базовый класс для пользовательских наборов (хотя это может использоваться непосредственно).

Рассматривают использование Collection<T> в Вашем коде, если нет определенные функции List<T>, что Вам нужно.

Вышеупомянутое просто рекомендации.

[Адаптированный от: Руководство по проектированию Платформы, Второй Выпуск]

42
ответ дан Arnold Zokas 5 November 2019 в 15:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: