C# 将IList或IEnumerable转换为数组的最佳方法
我有一个HQL查询,它可以生成结果的IList或结果的IEnumerable 但是,我希望它返回我正在选择的实体数组,实现这一点的最佳方法是什么?我可以通过它进行枚举并构建数组,也可以使用CopyTo()创建已定义的数组C# 将IList或IEnumerable转换为数组的最佳方法,c#,nhibernate,C#,Nhibernate,我有一个HQL查询,它可以生成结果的IList或结果的IEnumerable 但是,我希望它返回我正在选择的实体数组,实现这一点的最佳方法是什么?我可以通过它进行枚举并构建数组,也可以使用CopyTo()创建已定义的数组 还有更好的办法吗?我采用了CopyTo方法。您使用的是哪个版本的.NET?如果是.NET3.5,我只需要调用ToArray()就可以了 如果只有非泛型IEnumerable,请执行以下操作: IEnumerable query = ...; MyEntityType[] arr
还有更好的办法吗?我采用了CopyTo方法。您使用的是哪个版本的.NET?如果是.NET3.5,我只需要调用
ToArray()
就可以了
如果只有非泛型IEnumerable,请执行以下操作:
IEnumerable query = ...;
MyEntityType[] array = query.Cast<MyEntityType>().ToArray();
IEnumerable查询=。。。;
MyEntityType[]数组=query.Cast().ToArray();
如果您不知道该方法中的类型,但该方法的调用方知道,请将该方法设置为泛型,然后尝试以下操作:
public static void T[] PerformQuery<T>()
{
IEnumerable query = ...;
T[] array = query.Cast<T>().ToArray();
return array;
}
publicstaticvoid T[]PerformQuery()
{
IEnumerable查询=。。。;
T[]数组=query.Cast().ToArray();
返回数组;
}
将以下内容放入.cs文件中:
using System.Linq;
然后,您将能够使用System.Linq.Enumerable中的以下扩展方法:
public static TSource[] ToArray<TSource>(this System.Collections.Generic.IEnumerable<TSource> source)
publicstatictsource[]ToArray(此System.Collections.Generic.IEnumerable源)
即
IEnumerable查询=。。。;
object[]bob=query.ToArray();
我想重新发明轮子
public static T[] ConvertToArray<T>(this IEnumerable<T> enumerable)
{
if (enumerable == null)
throw new ArgumentNullException("enumerable");
return enumerable as T[] ?? enumerable.ToArray();
}
public static T[]ConvertToArray(此IEnumerable可枚举)
{
if(可枚举==null)
抛出新ArgumentNullException(“可枚举”);
将可枚举返回为T[]??enumerable.ToArray();
}
如果您没有Linq,我可以用以下方法解决它:
private T[] GetArray<T>(IList<T> iList) where T: new()
{
var result = new T[iList.Count];
iList.CopyTo(result, 0);
return result;
}
private T[]GetArray(IList-IList),其中T:new()
{
var result=新的T[iList.Count];
iList.CopyTo(结果为0);
返回结果;
}
希望它有帮助它是3.5,但iquiry没有ToArray,就我所知,IEnumerable或IList也没有?没有-只有一种扩展方法。(它不在界面本身内。)@Shimmy:是的,有。。。除此之外,它还告诉编译器需要什么样的数组!如果您只想要一个
对象[]
,只需使用Cast
。非通用的IEnumerable
没有ToArray
扩展方法,因此不能只调用foo.ToArray
或诸如此类的方法。ToArray
扩展方法位于System.Linq
命名空间中,@Alexander:除非返回的值真的是一个合适的数组,否则我认为这可能很好:)。@Alexander:除非返回的值真的是一个合适的数组。你能解释一下你的答案,以及你感觉自己在重新发明轮子是什么意思吗?嘿-我实际上有点像这样:很可能枚举值实际上是一个数组,您正在跳过ToArray()
调用中的新分配/复制到步骤(通过内部缓冲区
类)…尽管如果有人期望“标准”复制行为,他们会非常惊讶。@Chris:因为我是受System.Linq中ToArray()方法签名的启发。更荒谬的是,这个方法的实现应该调用IEnumerable.ToArray()
有人有没有没有没有Linq的解决方案?
private T[] GetArray<T>(IList<T> iList) where T: new()
{
var result = new T[iList.Count];
iList.CopyTo(result, 0);
return result;
}