Приведенный ниже код чрезвычайно медленный для таблиц любого значительного размера. (100, 1000 и т. Д.). Преступник создает объекты с объектами new T()
. Обратите внимание, что это не мой окончательный код, я только что сломал его части, чтобы получить более простой профиль. Игнорирование и инициализация происходят вместе, как только я реорганизую код обратно в форму.Как ускорить создание экземпляра большой коллекции объектов?
Есть ли способ ускорить это? Я, наверное, забываю что-то действительно простое, или, может быть, я костяк. Надеюсь, первый.
public static IList<T> ToList<T>(this DataTable table) where T : Model, new()
{
T[] entities = new T[table.Rows.Count];
// THIS LOOP IS VERY VERY SLOW
for (int i = 0; i < table.Rows.Count; i++)
entities[i] = new T();
// THIS LOOP IS FAST
for (int i = 0; i < table.Rows.Count; i++)
entities[i].Init(table, table.Rows[i]);
return new List<T>(entities);
}
редактировать для получения дополнительной информации:
Конструктор любого данного ModelType
будет выглядеть следующим образом:
public ModelType()
{
_modelInfo = new ModelTypeInfo();
}
Конструктор любого данного ModelTypeInfo
будет просто установить некоторые строки и строку [] значение , и это единственное задание класса - это предоставление значений.
редактировать даже для получения дополнительной информации:
Поскольку это, кажется, горячая тема, вот что мой метод выглядит для вещественных чисел, прежде чем вспыхивают строительство объекта и инициализации:
public static IList<T> ToList<T>(this DataTable table, ModelInfo modelInfo) where T : Model, new()
{
var tempRepository = new Repository<T>(modelInfo);
var list = new List<T>();
foreach (DataRow row in table.Rows)
list.Add(tempRepository.FromData(table, row));
return list;
}
по теме: Почему вы не просто создать '' List в первую очередь, а не в 'T []', а затем превратить его в список? Кроме того, почему 'for' вместо' foreach'? –
Svish
В действительности, это * есть *, что я делаю. Я просто сломал код в этой форме для демонстрационных целей. Вы знаете, чтобы показать, где код медленный, используя как можно меньше магии. –