В C # есть ли способ создать список непосредственно из массива без копирования? - PullRequest
0 голосов
/ 25 сентября 2018

Предлагает ли C # способ создания списка непосредственно из массива без копирования элементов один за другим?

Я знаю, что скрытый список просто поддерживает массив, поэтому это кажется естественнымчтобы начать с массива и создать новый список, просто укажите на массив внутри.Преимущество этого было бы огромным выигрышем в производительности при преобразовании массива в List.

Есть ли собственный способ сделать это в c #?Если нет, есть ли у кого-нибудь метод расширения или библиотека для этого?

Питер попросил дать количественную оценку "огромного прироста производительности". Так что здесь это основано на моем понимании того, как ListКонструктор работает:

List () содержит три перегрузки.Одна из перегрузок принимает IEnumerable в качестве входных данных.Эта перегрузка работает, объявляя новый список очень маленького размера (если он не изменился в более поздней сборке c #, исторический размер по умолчанию равен 0, а затем инициализируется до 4 при первом добавлении элемента).

Каждый раз, когда элемент добавляется в список, если новый элемент превышает емкость, размер массива удваивается путем создания совершенно нового массива и копирования элементов один за другим в новый массив.Результатом этого является то, что стоимость создания списка из IEnumerable составляет O (n) PLUS стоимость всех копий массива, которые происходят.Суть в том, что не маленький.

В случае IEnumerable конструкция List () должна работать таким образом, потому что IEnumerable имеет неизвестный размер.Если бы вы составляли List из массива, вы знали бы точный размер во время создания, что означает, что стоимость должна быть O (1).

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018
  1. Вероятно, вам не нужна дополнительная производительность, и если ваше приложение испытывает проблемы с производительностью, преобразование из массивов в списки, вероятно, не является причиной.
  2. Если это является виновником, и если вам нужно нужна производительность, вы должны сначала попытаться изменить код, чтобы вам не понадобилось конвертировать из массивов в списки так часто.
  3. В очень маловероятном случае, когда вам действительно понадобится , это необходимо, и если вы действительно амбициозны, вы сможете создать свой собственный IList<T> идобавьте к этому свой массив.

Итак, вы получите что-то вроде

public class CustomList<T> : IList<T>, ICollection<T>, IList, ICollection, IReadOnlyList<T>, IReadOnlyCollection<T>, IEnumerable<T>, IEnumerable
{
    public CustomList (T[] array)
    {
        //insert implementation here
    }
    // insert implimentation here
}

примечание: предполагаемый выигрыш в производительности, который вы получите от этого, вероятно, не стоитВремя, необходимое для реализации этого класса, не говоря уже о риске, что вы допустите некоторые ошибки при реализации нового Списка.Если вам нужно задать такой вопрос в переполнении стека, вы, вероятно, недостаточно опытны, чтобы сделать IList<T> лучше, чем Microsoft.

0 голосов
/ 25 сентября 2018

Нет, потому что объект List должен иметь возможность рассчитывать на контроль над массивом.Если у вас есть ссылка на массив вне Списка, он теряет эту гарантию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...