Эффективный способ вставить значение в массив? - PullRequest
5 голосов
/ 13 декабря 2011

Мне нужно вставить значение в массив ... в идеале я мог бы просто начать с List<myObj>, но методы, которые мне нужно использовать, вместо этого возвращают myObj[].

Мне всегда нужно вставлять значение в первую позицию, а не записывать значения, уже находящиеся в массиве ... Я придумал следующую схему ..

    List<myObj> list = array.ToList<myObj>();
        if (list.Count > 0 && list != null)
        {
            list.Insert(0, InsertRecord(myParam)); // InsertRecord() is one of my methods...
        }
        return list.ToArray();

Мойвопрос ... это даже отдаленно эффективно?Есть ли лучший способ сделать то, что мне нужно сделать?

Ответы [ 2 ]

7 голосов
/ 13 декабря 2011

Я думаю, вы можете сэкономить время с

var newArray = new myObj[oldArray.Length  + 1];    
oldArray.CopyTo(newArray, 1);
newArray[0] = InsertRecord(myParam);
3 голосов
/ 13 декабря 2011

Класс List<T> поддерживается массивом, поэтому нет никакой разницы в производительности между использованием List для вставки с индексом 0 и использованием массива для вставки с индексом 0, за исключением того, что разработчики BCL протестировали гораздо более обширнодля исполнения.Не принимайте снижение производительности метода ToList и конструктора List<T>, так как новое распределение массива происходит за кулисами в любом случае.

Хуже, вам может понадобиться массив two Выделения с вашим опубликованным кодом, поскольку конструктор List<T> (вызываемый ToList) может выделять массив точно размером array, а затем метод Add должен выделить новый массив только для выполнения вставки.Маловероятно, но возможно.

Вкратце, выделите новый массив самостоятельно.

РЕДАКТИРОВАТЬ:

Учитывая, что ваш метод должен вернуть массив,бессмысленно просматривать список.Со списком вы собираетесь скопировать исходный массив в массив, поддерживающий List<T>, затем вставить, а затем скопировать этот резервный массив в другой массив, который будет возвращен из вашего метода.Это делает минимум два выделения массива плюс возможный третий, который я упомянул выше.Использование необработанных массивов гарантирует ровно одно выделение массива.

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