Предлагает ли C # способ создания списка непосредственно из массива без копирования элементов один за другим?
Я знаю, что скрытый список просто поддерживает массив, поэтому это кажется естественнымчтобы начать с массива и создать новый список, просто укажите на массив внутри.Преимущество этого было бы огромным выигрышем в производительности при преобразовании массива в List.
Есть ли собственный способ сделать это в c #?Если нет, есть ли у кого-нибудь метод расширения или библиотека для этого?
Питер попросил дать количественную оценку "огромного прироста производительности". Так что здесь это основано на моем понимании того, как ListКонструктор работает:
List () содержит три перегрузки.Одна из перегрузок принимает IEnumerable в качестве входных данных.Эта перегрузка работает, объявляя новый список очень маленького размера (если он не изменился в более поздней сборке c #, исторический размер по умолчанию равен 0, а затем инициализируется до 4 при первом добавлении элемента).
Каждый раз, когда элемент добавляется в список, если новый элемент превышает емкость, размер массива удваивается путем создания совершенно нового массива и копирования элементов один за другим в новый массив.Результатом этого является то, что стоимость создания списка из IEnumerable составляет O (n) PLUS стоимость всех копий массива, которые происходят.Суть в том, что не маленький.
В случае IEnumerable конструкция List () должна работать таким образом, потому что IEnumerable имеет неизвестный размер.Если бы вы составляли List из массива, вы знали бы точный размер во время создания, что означает, что стоимость должна быть O (1).