Преобразовывает этот ArrayList в Универсальный эффективный Список?

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

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

5
задан kemiller2002 7 June 2010 в 18:31
поделиться

6 ответов

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

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

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

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

2
ответ дан 14 December 2019 в 08:42
поделиться

Самый большой штраф при использовании списков массивов - это боксирование.

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

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

1
ответ дан 14 December 2019 в 08:42
поделиться

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

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

List<Grid_Heading_Blk> heading = new List<Grid_Heading_Blk>( arrayList );
2
ответ дан 14 December 2019 в 08:42
поделиться

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

Это зависит от того, чем еще вы занимаетесь.

Ваш пробег может отличаться, но, по моему опыту, хотя ArrayList может быть «медленнее», чем List , я никогда не делал так мало другого, как в так или иначе заметно.

Тем не менее, приятно, когда компилятор выполняет за меня проверку типов, и хорошо, что не нужно ничего приводить.

0
ответ дан 14 December 2019 в 08:42
поделиться

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

0
ответ дан 14 December 2019 в 08:42
поделиться

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

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

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

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

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

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

2
ответ дан 14 December 2019 в 08:42
поделиться
Другие вопросы по тегам:

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