3 сценария:
1)
Condition: коллекцию можно привести к IIListProvider<TSource>
Action: будет вызван метод ToList/ToArray с этого провайдера
Perfomance: зависит от имплементации провайдера
2)
Condition: коллекцию можно привести к ICollection<T>
Action: создаем Array/List(по сути массив под капотом) юзая ICollection.Count и копируем в него элементы
Perfomance: быстро, так как надо скопировать 1 раз элементы в массив
3)
Condition: первые два условия не отработали
Action:
- ToList
В цикле проходим по коллекции и вставляем элементы методом Add
- ToArray
Инициализируем Array через специальный класс LargeArrayBuilder
Perfomance:
- ToList
Медленнее чем сценарий 2, так как можем много раз вызывать операцию увеличения массива -> создаем новый массив большего размера и копируем в него элементы старого массива
- ToArray
Общий алгоритм билдера -> создаем промежуточные массивы фиксированного размера, заполняем их, в конце их соединяем в один общий массив. Так же медленнее чем сценарий 2, но с ToList разница зависит от количества элементов