Я использую 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
, с глубоким копированием.
Это довольно просто. То, что вы хотите сделать, - спроектировать значения внутри исходной последовательности в разные значения, а затем привести полученную последовательность в массив.
LINQ делает проецирование с помощью Select
, поэтому самый простой, самый естественный и (по крайней мере, до тех пор, пока вы собираетесь использовать LINQ) наиболее эффективный способ записи:
var result = input.AsEnumerable().Select(i => i.GetConvertedType()).ToArray();
Это фактически эквивалентно ручному циклу foreach
в вашем примере.
.AsEnumerable()
должна это исправить. Отредактировал ответ.