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


98

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

但是,我希望它返回我选择的Entity的数组,实现该目标的最佳方法是什么?我可以枚举它并构建数组,也可以使用CopyTo()一个定义的数组。

有什么更好的办法吗?我采用了CopyTo方法。


4
没有 Linq,有人可以解决吗?
Bitterblue

Answers:


166

您正在使用哪个版本的.NET?如果是.NET 3.5,我会打电话给ToArray()它并完成它。

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

IEnumerable query = ...;
MyEntityType[] array = query.Cast<MyEntityType>().ToArray();

如果您不知道该方法中的类型,但是该方法的调用者确实知道该类型,请将该方法设为通用并尝试以下操作:

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

它是3.5,但是据我所知,IQuery没有ToArray,IEnumerable或IList也没有?
吉士

2
否-只有一种扩展方法。(它不在界面本身之内。)
Jon Skeet

3
@Shimmy:是的,除了其他内容之外,它还告诉编译器需要什么样的数组!如果只想object[]公正使用Cast<object>。非泛型IEnumerable没有ToArray扩展方法,因此您不能只调用foo.ToArray<object>或类似方法。
乔恩·斯基特

22
ToArray扩展方法位于System.Linq名称空间中,以为您可能知道:)。
Tomas Jansson

1
@Alexander:除非返回的值确实一个适当的数组,否则不会。
乔恩·斯基特

47

将以下内容放入您的.cs文件:

using System.Linq;

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

public static TSource[] ToArray<TSource>(this System.Collections.Generic.IEnumerable<TSource> source)

IEnumerable<object> query = ...;
object[] bob = query.ToArray();

嗯...默认情况下,单元测试项目不包含linq。谢谢!
zsf222 2015年

6

我想重新发明轮子...

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

    return enumerable as T[] ?? enumerable.ToArray();
}

您能否解释您的答案,以及您觉得自己正在重新发明轮子的意思?
ChrisCamp

嘿-我实际上是这样的:几乎没有机会,可枚举实际上是一个数组,您跳过了新的分配/复制ToArray()(通过内部Buffer类)到调用的步骤中……尽管有人期望“标准”复制行为,他们会很惊讶。
JerKimball 2013年

@Chris:因为我受到System.Linq中ToArray()方法签名的启发。msdn.microsoft.com/zh-CN/library/bb298736.aspx
Philippe Matray 2013年

为了增加可笑性,应调用此方法的实现IEnumerable.ToArray()
The Muffin Man

2

如果您没有Linq,我可以通过以下方式解决:

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

        iList.CopyTo(result, 0);

        return result;
    }

希望能帮助到你

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.