将IList或IEnumerable转换为Array的最佳方法

jis*_*shi 93 c# nhibernate

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

但是,我希望它返回我正在选择的实体数组,实现它的最佳方法是什么?我可以通过它枚举并构建数组,或者使用CopyTo()定义的数组.

有没有更好的方法?我选择了CopyTo方法.

Jon*_*eet 157

您使用的是哪个版本的.NET?如果它是.NET 3.5,我只需要调用ToArray()并完成它.

如果您只有非通用IEnumerable,请执行以下操作:

IEnumerable query = ...;
MyEntityType[] array = query.Cast<MyEntityType>().ToArray();
Run Code Online (Sandbox Code Playgroud)

如果您不知道该方法中的类型但该方法的调用者确实知道它,请将该方法设为泛型并尝试:

public static void T[] PerformQuery<T>()
{
    IEnumerable query = ...;
    T[] array = query.Cast<T>().ToArray();
    return array;
}
Run Code Online (Sandbox Code Playgroud)

  • `ToArray`扩展方法在`System.Linq`命名空间中,认为可能很好知道:). (21认同)
  • @Shimmy:是的......除了其他任何东西,它告诉编译器期望什么样的数组!如果你只想要`object []`,只需使用`Cast <object>`.非泛型`IEnumerable`没有`ToArray`扩展方法,所以你不能只调用`foo.ToArray <object>`或类似的东西. (3认同)
  • 不 - 只有一种扩展方法.(它不在界面本身内.) (2认同)

小智 44

将以下内容放在.cs文件中:

using System.Linq;
Run Code Online (Sandbox Code Playgroud)

然后,您将能够使用System.Linq.Enumerable中的以下扩展方法:

public static TSource[] ToArray<TSource>(this System.Collections.Generic.IEnumerable<TSource> source)
Run Code Online (Sandbox Code Playgroud)

IEnumerable<object> query = ...;
object[] bob = query.ToArray();
Run Code Online (Sandbox Code Playgroud)

  • 由于使用System.Linq而被upvoted; (4认同)

Phi*_*ray 6

我想重新发明轮子......

public static T[] ConvertToArray<T>(this IEnumerable<T> enumerable)
{
    if (enumerable == null)
        throw new ArgumentNullException("enumerable");

    return enumerable as T[] ?? enumerable.ToArray();
}
Run Code Online (Sandbox Code Playgroud)


Lug*_*Lug 6

如果你没有 Linq,我通过以下方式解决了这个问题:

    private T[] GetArray<T>(IList<T> iList) where T: new()
    {
        var result = new T[iList.Count];

        iList.CopyTo(result, 0);

        return result;
    }
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你