从类型的IQueryable转换为转换类型的数组的最佳方法是什么?

时间:2014-08-22 12:59:23

标签: c# arrays performance type-conversion iqueryable

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

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

这两种方式中的哪一种在性能方面更好?还有更好的选择吗?

提前谢谢。

更新:GetConvertedType()以“深层复制”的方式根据NormalType包含的数据创建转换类型的新实例。

1 个答案:

答案 0 :(得分:3)

这非常简单。您要做的是将源序列中的值投影到不同的值中,然后将生成的序列放入数组中。

LINQ使用Select进行投影,因此最简单,最自然,并且(至少只要你将使用LINQ)编写它的最佳方式是:

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

这实际上等同于示例中的手动foreach循环。