Тип коллекции System.Collections.Generic.List
Отличие [System.Collections.Generic.List] от [System.Collections.ArrayList] в PowerShell
1. Типизация
- [System.Collections.ArrayList] — не типизирован, может содержать элементы разных типов.
- [System.Collections.Generic.List[тип]] — обобщённый, содержит элементы только одного заданного типа.
2. Производительность
- ArrayList использует упаковку (boxing) и распаковку (unboxing) для значимых типов, что снижает производительность.
- List[T] работает быстрее, особенно с примитивами (например, `int`), благодаря отсутствию упаковки.
3. Проверка типов
- ArrayList — ошибки типов проявляются только во время выполнения.
- List[T] — PowerShell выдаёт ошибку при попытке добавить элемент неправильного типа.
4. Использование
- ArrayList:
$a = [System.Collections.ArrayList]::new() $a.Add(1) $a.Add("text")
- List[int]:
$l = [System.Collections.Generic.List[int]]::new() $l.Add(1) ; допустимо $l.Add("text") ; ошибка $mylist = [System.Collections.Generic.List[string]]::new() # Список строк $mylist = [System.Collections.Generic.List[int]]@(1,2,3) # Присвоение значений при объявлении или так using namespace System.Collections.Generic $myList = [List[int]]@(1,2,3) Если не известно тип объекта $list = [List[psobject]]::new() using namespace System.Collections.Generic $myList = [List[string]]@('Zero','One','Two','Three') [void]$myList.Remove("Two") Zero One Three
5. Назначение
- ArrayList — подходит, если нужно хранить элементы разных типов (редкий случай).
- List[T] — рекомендуется для типобезопасной, быстрой работы с коллекцией одного типа.
6. Совместимость
- ArrayList — устаревший, появился в .NET Framework.
- List[T] — современный, универсальный, используется в .NET Core и .NET 5+.
7. Примеры задач
🟦 Когда использовать ArrayList
- Быстрая сборка разнородных значений (например, текст + числа + логические флаги) для последующей сериализации:
$mixed = [System.Collections.ArrayList]::new() $mixed.Add("Имя") $mixed.Add(42) $mixed.Add($true)
- Прототипирование, когда ещё не известно, какого типа будут данные.
🟩 Когда использовать List[T]
- Хранение чисел для последующего вычисления среднего:
$scores = [System.Collections.Generic.List[int]]::new() 1..100 | ForEach-Object { $scores.Add($_) } $avg = ($scores | Measure-Object -Average).Average
- Формирование списка путей к файлам:
$paths = [System.Collections.Generic.List[string]]::new() Get-ChildItem -Recurse | ForEach-Object { $paths.Add($_.FullName) }
- Фильтрация данных по условиям, с гарантией работы только с нужным типом:
$ports = [System.Collections.Generic.List[int]]::new() $ports.Add(80) $ports.Add(443)
8. Итого
Критерий | ArrayList | List[T] |
---|---|---|
Типизация | Нет | Да |
Разные типы данных | Да | Нет |
Производительность | Ниже | Выше |
Проверка типов | Во время выполнения | При добавлении |
Совместимость | Старый .NET | Современный .NET |
Рекомендуется | ❌ | ✅ |