Тип коллекции System.Collections.Generic.List

  • [System.Collections.ArrayList] — не типизирован, может содержать элементы разных типов.
  • [System.Collections.Generic.List[тип]] — обобщённый, содержит элементы только одного заданного типа.
  • ArrayList использует упаковку (boxing) и распаковку (unboxing) для значимых типов, что снижает производительность.
  • List[T] работает быстрее, особенно с примитивами (например, `int`), благодаря отсутствию упаковки.
  • ArrayList — ошибки типов проявляются только во время выполнения.
  • List[T] — PowerShell выдаёт ошибку при попытке добавить элемент неправильного типа.
  • 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
  • ArrayList — подходит, если нужно хранить элементы разных типов (редкий случай).
  • List[T] — рекомендуется для типобезопасной, быстрой работы с коллекцией одного типа.
  • ArrayList — устаревший, появился в .NET Framework.
  • List[T] — современный, универсальный, используется в .NET Core и .NET 5+.

🟦 Когда использовать 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)
Критерий ArrayList List[T]
Типизация Нет Да
Разные типы данных Да Нет
Производительность Ниже Выше
Проверка типов Во время выполнения При добавлении
Совместимость Старый .NET Современный .NET
Рекомендуется