Код, который я пишу, получает ArrayList от неуправляемого кода, и этот ArrayList будет всегда содержать один или несколько объектов типа Grid_Heading_Blk. Я рассмотрел изменение этого ArrayList к универсальному Списку, но я не уверен, если операция преобразования будет столь дорогой, что аннулирует преимущества работы с универсальным списком. В настоящее время я просто выполняю a foreach (Grid_Heading_Blk in myArrayList)
операция для работы с содержанием ArrayList после передачи ArrayList к классу, который будет использовать его.
Я должен преобразовать ArrayList в универсальный введенный список? И если так, каков самый эффективный способ сделать так?
Вот удар по эффективному способу создания универсального списка из ArrayList.
List<Grid_Heading_Blk> myList = new List<Grid_Heading_Blk>(source.Count);
myList.AddRange(source.OfType<Grid_Heading_Blk>());
При вызове конструктора , который принимает int , резервное хранилище выделяется только один раз.
Как всегда, вы должны измерять производительность, используя те инструменты, которые вы обычно используете.
Самый большой штраф при использовании списков массивов - это боксирование.
С дженериками вы получаете:
1. безопасность во время компиляции
2. расширения generics
3. снимается ограничение на то, что все в списке должно быть преобразовано к типу object.
Это те преимущества, которые вы получаете при их использовании. Это преимущества, но если вам придется заново заполнять generic из ArrayList, это может оказаться бесполезным, особенно если вы просто просматриваете список, чтобы получить объекты.
Зачем вообще нужно преобразовывать ArrayList
? Честно говоря, кажется, что ваш цикл foreach справится с этой задачей. Да, как сказал Кевин выше, единственным штрафом, который вы заплатите, будет разгруппировка, но на самом деле это довольно простой код, и у вас, вероятно, не так много заголовков сетки, чтобы заплатить реальный удар по производительности.
Но если вы должны преобразовать его, я бы сказал, что вместо того, чтобы писать свой собственный цикл for для преобразования в общий тип List, лучше использовать конструктор, который принимает тип IEnumerable
(то, что ArrayList
уже должен реализовать. )
List<Grid_Heading_Blk> heading = new List<Grid_Heading_Blk>( arrayList );
«Эффективность» не является свойством «или-или». Это относительно, так же как большая мышь, вероятно, не больше маленького слона.
Это зависит от того, чем еще вы занимаетесь.
Ваш пробег может отличаться, но, по моему опыту, хотя ArrayList
может быть «медленнее», чем List
, я никогда не делал так мало другого, как в так или иначе заметно.
Тем не менее, приятно, когда компилятор выполняет за меня проверку типов, и хорошо, что не нужно ничего приводить.
Если объекты поступают из неуправляемого кода и вам не нужно добавлять или удалять объекты, то массив Grid_Heading_Blk может быть более эффективным, чем список. Если вы можете обойтись без использования массива, использование цикла for может быть немного быстрее, чем foreach.
Я часто использую этот контрольный список для оценки вопросов, подобных вашему:
List
является гораздо более раскрывающим намерения, чем ArrayList
. Таким образом, даже не учитывая эффективность, уже есть большой выигрыш для пункта 2.
Чтобы преобразовать ArrayList
в List<>
, необходимо выполнить итерацию по ArrayList
один раз и привести каждый элемент. В foreach
выполняется неявное приведение, поэтому накладные расходы заключаются только в дополнительной итерации.
Итерация последовательности дважды увеличивает производительность с O(n)
до O(2n)
, что по-прежнему составляет O(n)
(для производительности важна величина, а не значение). Поэтому изменение можно считать доброкачественным.
Однако, если буквально все, что вы делаете, это выполнение foreach
, вам следует просто использовать ArrayList
напрямую - изменение на List<>
не даст вам больше выразительных возможностей.