Лучший способ сделать преобразование из IQueryable типа в массив преобразованного типа?

1

Я использую Entity Framework и хочу поместить элементы IQueryable в массив преобразованного типа. Имея NormalType как первый тип и ConvertedType как преобразованный, "преобразование" выполняется следующим образом:

//Creates a NormalType object based on ConvertedType instance.
NormalType nt = new NormalType (ctInstance);
// Returns a new ConvertedType instance,
//based on the content of the NormalType instance.
ConvertedType ct = nt.getConvertedType();

Теперь я хочу преобразовать список типа NormalType в массив ConvertedType (IQueryable<NormalType> → ConvertedType[]).

Моя первая мысль состоит в том, чтобы классически перебирать IQueryable<NormalType>, помещать данные в List<ConvertedType> а затем преобразовывать второй список в массив с помощью ToArray():

//Rest of code....
List<ConvertedType> convertedTypeList = new List<ConvertedType>();
//normalTypeIQueryable is of type IQueryable<NormalType>
foreach(NormalType normalType in normalTypeIQueryable) 
{
  convertedTypeList.Add(normalType.getConvertedType());
}
ConvertedType[] convertedTypeArray = convertedTypeList.ToArray();

Моя вторая мысль - сделать это, используя ToList(), ConvertAll(...) и ToArray() в одном ToArray():

normalTypeIQueryable.ToList().ConvertAll(n => n.GetConvertedType()).ToArray();

Я думаю, что последний из них приведет к более чем одному циклу конверсий.

Какой из этих двух способов лучше с точки зрения производительности? Есть ли еще лучшая альтернатива?

Заранее спасибо.

UPDATE: GetConvertedType() создает новый экземпляр преобразованного типа, основанный на данных, NormalType содержит NormalType, с глубоким копированием.

  • 0
    Я бы пошел на второе решение. Это зависит от сложности GetConvertedType
  • 0
    Вопрос обновлен.
Показать ещё 8 комментариев
Теги:
arrays
performance
type-conversion
iqueryable

1 ответ

2
Лучший ответ

Это довольно просто. То, что вы хотите сделать, - спроектировать значения внутри исходной последовательности в разные значения, а затем привести полученную последовательность в массив.

LINQ делает проецирование с помощью Select, поэтому самый простой, самый естественный и (по крайней мере, до тех пор, пока вы собираетесь использовать LINQ) наиболее эффективный способ записи:

var result = input.AsEnumerable().Select(i => i.GetConvertedType()).ToArray();

Это фактически эквивалентно ручному циклу foreach в вашем примере.

  • 0
    После тестирования этого в моем коде LINQ не распознает GetConvertedType (). Пожалуйста, обновите свой ответ. Спасибо!!
  • 0
    @NickL .: .AsEnumerable() должна это исправить. Отредактировал ответ.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню