Эффективно ли преобразование этого ArrayList в общий список? - PullRequest
5 голосов
/ 07 июня 2010

Код, который я пишу, получает ArrayList из неуправляемого кода, и этот ArrayList всегда будет содержать один или несколько объектов типа Grid_Heading_Blk. Я рассмотрел вопрос об изменении этого ArrayList на общий список, но я не уверен, будет ли операция преобразования настолько дорогой, чтобы свести на нет преимущества работы с общим списком. В настоящее время я просто запускаю операцию foreach (Grid_Heading_Blk in myArrayList) для работы с содержимым ArrayList после передачи ArrayList классу, который будет его использовать.

Должен ли я преобразовать ArrayList в общий типизированный список? И если да, то какой самый эффективный способ сделать это?

Ответы [ 7 ]

2 голосов
/ 08 июня 2010

Вот пример эффективного способа создания универсального списка из ArrayList.

List<Grid_Heading_Blk> myList = new List<Grid_Heading_Blk>(source.Count);
myList.AddRange(source.OfType<Grid_Heading_Blk>());

При вызове конструктора , который принимает int , резервное хранилище выделяется только один раз.

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

2 голосов
/ 08 июня 2010

Зачем вам вообще нужно конвертировать ArrayList? Честно говоря, ваш цикл foreach выглядит так, как будто сработает. Да, как сказал Кевин выше, единственное наказание, которое вы бы заплатили, - это распаковка, но на самом деле это довольно простой код, и вам, вероятно, не хватает заголовков сетки, чтобы нанести реальный удар по производительности.

Но если вы должны преобразовать его, я бы сказал, вместо того, чтобы писать свой собственный цикл for для преобразования в универсальный тип List, может быть лучше использовать конструктор, который принимает тип IEnumerable (что-то ArrayList должно реализовывать уже .)

List<Grid_Heading_Blk> heading = new List<Grid_Heading_Blk>( arrayList );
2 голосов
/ 08 июня 2010

Я часто использую этот контрольный список для оценки вопросов, подобных вашему:

  1. Сделайте это правильно
  2. Проясни это
  3. Сделайте это лаконичным
  4. Сделайте это эффективным

List<Grid_Heading_Blk> является далеко более показательным для намерений, чем ArrayList. Так что, даже не принимая во внимание эффективность, уже есть большой выигрыш для пункта 2.

Чтобы преобразовать ArrayList в List<>, необходимо выполнить итерацию по ArrayList один раз и привести каждый элемент. foreach выполняет неявное приведение, поэтому накладные расходы относятся только к дополнительной итерации.

Итерация последовательности дважды приводит к повышению производительности с O(n) до O(2n), который по-прежнему равен O(n) (величина, а не значение, имеет значение для производительности). Таким образом, вы можете считать изменение благоприятным.

Однако, если буквально все , которые вы делаете, запускают foreach, вы должны просто использовать ArrayList напрямую - изменение его на List<> не дает вам больше выразительной силы.

1 голос
/ 07 июня 2010

Самое большое наказание, которое у вас есть при использовании ArrayLists - это бокс.

С дженериками вы получаете:
1. безопасность времени компиляции
2. общие расширения
3. Снимите это ограничение с того, что все в списке преобразуется в объект типа.

Вот те преимущества, которые вы получаете, используя их. Это преимущество, но если вам нужно повторно заполнить универсальный из ArrayList, это может не стоить делать, особенно если вы просто просматриваете список, чтобы получить объекты.

0 голосов
/ 21 октября 2011

Вы можете отфильтровать все элементы arrayList, которые можно привести к одному и тому же типу, используя Enumerable.OfType (Of TResult) Метод

List<MyClass> typedList = arrayList.OfType<MyClass>().ToList();

(на основании предложения в http://www.codeproject.com/Tips/68291/Convert-ArrayList-to-a-Generic-List)

0 голосов
/ 08 июня 2010

Если объекты поступают из неуправляемого кода и вам не нужно добавлять или удалять объекты, тогда массив Grid_Heading_Blk может быть более эффективным, чем List. Если вы можете избежать использования массива, цикл for может быть немного быстрее, чем foreach.

0 голосов
/ 08 июня 2010

«Эффективный» не является или-или свойством. Это относительно, как большая мышь, вероятно, не больше, чем маленький слон.

Это зависит от того, что еще вы делаете.

Ваш пробег может отличаться, но, по моему опыту, хотя ArrayList может быть "медленнее", чем List<T>, я никогда не делал так мало, чтобы это было хоть как-то заметно.

Тем не менее, хорошо, что компилятор выполняет для меня проверку типов, и хорошо, что нет необходимости приводить вещи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...