从类型的IQueryable转换为已转换类型的数组的最佳方式

本文关键字:转换 类型 最佳 方式 数组 IQueryable | 更新日期: 2023-09-27 18:19:10

我正在使用实体框架,并希望将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():

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

我认为最后一个将通过转换导致多个循环。

哪一种方式在性能方面更好?有没有更好的选择?

提前谢谢你。

UPDATE: GetConvertedType()基于NormalType包含的数据以"深度复制"的方式创建一个转换类型的新实例

从类型的IQueryable转换为已转换类型的数组的最佳方式

这很简单。您需要做的是将源序列中的值投影为不同的值,然后将结果序列放入数组中。

LINQ用Select做投影,所以最简单,最自然,并且(至少只要你打算使用LINQ)最高效的方式来写它:

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

这有效地等同于示例中的手动foreach循环。