Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将IList或IEnumerable转换为数组的最佳方法_C#_Nhibernate - Fatal编程技术网

C# 将IList或IEnumerable转换为数组的最佳方法

C# 将IList或IEnumerable转换为数组的最佳方法,c#,nhibernate,C#,Nhibernate,我有一个HQL查询,它可以生成结果的IList或结果的IEnumerable 但是,我希望它返回我正在选择的实体数组,实现这一点的最佳方法是什么?我可以通过它进行枚举并构建数组,也可以使用CopyTo()创建已定义的数组 还有更好的办法吗?我采用了CopyTo方法。您使用的是哪个版本的.NET?如果是.NET3.5,我只需要调用ToArray()就可以了 如果只有非泛型IEnumerable,请执行以下操作: IEnumerable query = ...; MyEntityType[] arr

我有一个HQL查询,它可以生成结果的IList或结果的IEnumerable

但是,我希望它返回我正在选择的实体数组,实现这一点的最佳方法是什么?我可以通过它进行枚举并构建数组,也可以使用CopyTo()创建已定义的数组


还有更好的办法吗?我采用了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;
    }