Это потому, что .NET был разработан для работы на современных процессорах. Которые намного, намного быстрее, чем шина памяти. Процессор работает на частоте около 2 гигагерц. Оперативная память вашей машины обычно составляет пару сотен мегагерц. Чтение байта из ОЗУ занимает более ста тактов.
Что делает кэши ЦП очень важными на современных процессорах, большое количество чипов расходуется на увеличение кэш-памяти до максимально возможного. На сегодняшний день типичным является 64 КБ для кэша L1, самая быстрая память и физически расположенная очень близко к ядру процессора, 256 КБ для кэша L2, медленнее и дальше от ядра, около 8 МБ для кэша L3, еще медленнее и дольше прочь, общая для всех ядер чипа.
Чтобы сделать кеши эффективными, очень важно иметь последовательный доступ к памяти. Чтение первого байта может быть очень дорогим, если необходим доступ к памяти L3 или RAM, следующие 63 байта очень дешевы. Размер «строки кэша», единица передачи данных для шины памяти.
Это делает массив на сегодняшний день наиболее эффективной структурой данных, его элементы хранятся последовательно в памяти. И связанный список, безусловно, наихудшей из возможных структур данных, его элементы естественным образом разбросаны по памяти, что может привести к очень дорогой потере кэша для каждого элемента.
Соответственно, все коллекции .NET, кроме LinkedList <>, реализованы как массивы внутри. Обратите внимание, что Stack <> уже естественным образом реализован в виде массива, поскольку вы можете только нажать и вытолкнуть элемент из конца массива. O (1) операция. Изменение размера массива амортизируется O (logN).