ArrayList по сравнению с массивом объектов по сравнению с Набором T

В MySQL 8.0 это так же просто, как использовать оконную функцию AVG(...) OVER(...):

SELECT
   user,
   score,
   score - AVG(score) OVER(PARTITION BY user) AS variance
FROM scores

В более ранних версиях вы можете использовать агрегированный подзапрос для вычисления среднего значения для пользователя, а затем JOIN его с таблица:

SELECT
   s.user,
   s.score,
   s.score - t.avg_score AS variance
FROM scores s
INNER JOIN (
    SELECT user, AVG(score) avg_score FROM scores GROUP BY user
) t ON s.user = t.user
7
задан Paul Bellora 20 January 2013 в 00:38
поделиться

6 ответов

Никто не упомянул совет Инструкций по Платформе: не использовать List<T> в общедоступном API:

Мы не рекомендуем использовать Список в общедоступных API по двум причинам.

  • List<T> не разработан, чтобы быть расширенным. т.е. Вы не можете переопределить участников. Это, например, означает что объектный возврат List<T> от свойства не сможет быть уведомленным, когда набор будет изменен. Collection<T> позволяет Вы переопределяете защищенного участника SetItem, чтобы быть “уведомленными”, когда новые объекты добавляются, или изменяется существующий объект.

  • Список имеет много участников, которые не релевантны во многих сценариях. Мы говорим это List<T> слишком “занято” для общедоступных объектных моделей. Вообразите ListView. Возврат свойства Items List<T> со всем его богатством. Теперь, посмотрите на фактическое ListView.Items возвратите тип; это - путь, более простой и подобный Collection<T> или ReadOnlyCollection<T>

Кроме того, если Вашей целью является двухсторонняя Привязка данных, взгляните на BindingList<T> (с протестом, что это не является поддающимся сортировке 'из поля'!)

4
ответ дан 6 December 2019 в 10:03
поделиться

Да, Collection<T> (или List<T> чаще всего), делает ArrayList в значительной степени устаревший. В частности, я верю ArrayList даже не поддерживается в Silverlight 2.

Массивы хорошо в некоторых случаях, но должны считаться несколько вредными - у них есть различные недостатки. (Они в основе реализации большинства наборов, конечно...), я вдавался бы в большее количество подробностей, но Eric Lippert делает это настолько лучше, чем я когда-нибудь мог в статье, на которую ссылается ссылка. Я суммировал бы его здесь, но это довольно трудно сделать. Действительно стоит просто прочитать целое сообщение.

11
ответ дан 6 December 2019 в 10:03
поделиться

Обычно необходимо 'раздать' IEnumerable <T> или ICollection <T> (в зависимости от того, имеет ли смысл для потребителя добавлять объекты).

3
ответ дан 6 December 2019 в 10:03
поделиться

Если у Вас будет неизменный список клиентов, который является... Вашим списком клиентов, то не изменится, это является относительно маленьким, и Вы будете всегда выполнять итерации по нему сначала для длительности, и Вы не должны добавить к списку или удалить из него, то массив, вероятно, очень хорошо.

Если Вы не уверены, однако, то Ваш лучший выбор является набором некоторого типа. Какой набор, который Вы выбираете, зависит от операций, которые Вы хотите выполнить на нем. Наборы - все о вставках, манипуляциях, поисках, и удаляет. Если Вы действительно часто посещаете частые поиски данного элемента, то словарь может быть лучшим. Если необходимо отсортировать данные, то, возможно, SortedList будет работать лучше.

Я не волновался бы о "легком весе", если Вы не говорите значительное число элементов и даже затем преимущества O (1), поиски перевешивают затраты на ресурсы.

Когда Вы "раздаете" набор, Вы только передаете ссылку, которая является в основном указателем. Таким образом, нет никакого различия в производительности между передачей набора и массивом.

1
ответ дан 6 December 2019 в 10:03
поделиться

Я собираюсь вставить отколовшийся аргумент и Jon и Eric Lippert), что означает, что необходимо быть очень утомленными от моего ответа, действительно!).

Основа аргументов Eric Lippert против массивов - то, что содержание неизменно, в то время как сама структура данных не. Относительно возврата их из методов содержание Списка так же изменяемо. На самом деле, потому что можно добавить или вычесть элементы из Списка, я утверждал бы, что это делает возвращаемое значение более изменяемым, чем массив.

Другая причина я люблю Массивы, состоит в том, потому что когда-то назад у меня был маленький раздел производительности критический код, таким образом, я сравнил рабочих характеристик этих двух, и массивы унесли Списки из воды. Теперь, позвольте мне протест это путем высказывания, что это был узкий тест для того, как я собирался использовать их в определенной ситуации, и это идет вразрез с тем, что я понимаю обоих, но числа дико отличались.

Так или иначе слушайте Jon и Eric =), и я соглашаюсь, что Список почти всегда имеет больше смысла.

0
ответ дан 6 December 2019 в 10:03
поделиться

Я соглашаюсь с Alun с одним дополнением. Если можно хотеть обратиться к возвращаемому значению нижним myArray[n], то используйте IList.

Массив по сути поддерживает IList (а также IEnumerable и ICollection, в этом отношении). Таким образом, если Вы передаете интерфейсом, можно все еще использовать массив в качестве базовой структуры данных. Таким образом методы, в которые Вы передаете массив, не должны "знать", что базовый datastructure является массивом:

        public void Test()
{
    IList<Item> test = MyMethod();
}

public IList<Item> MyMethod()
{
    Item[] items = new Item[] {new Item()};
    return items;
}
0
ответ дан 6 December 2019 в 10:03
поделиться
Другие вопросы по тегам:

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