К сожалению, много циклов и глубокое копирование объектов потребует времени.Я не думаю, что 3 секунды - это необоснованно много времени, чтобы это заняло.
Но вы потенциально можете улучшить скорость.
Во-первых, если вы знаете, сколько элементов нужно сохранить в списке результатов, вы можете заранее установить внутреннюю емкость , чтобы предотвратить изменение размера списка.Изменение размера является дорогостоящим видом деятельности, которого можно избежать при необходимости.Это можно сделать, вручную изменив свойство емкости списка или передав емкость в качестве аргумента конструктора для списка .
После выделения емкости сложность добавления в список должно составлять O(1)
, повторных выражений (которые являются O(n)
сложностью см. Этот ответ ) не потребуется.Маловероятно, что добавление к списку в этом случае станет узким местом.
Вы также можете удалить нулевые значения из первоначального списка, из которого вы копируете заранее, чтобы исключить необходимость в операторе if, который должен оцениваться каждый раз.Использование linq :
var noNulls = listSource.where(o => o != null)