Лучший способ конвертировать IList или IEnumerable в массив

У меня есть запрос HQL, который может генерировать либо IList результатов, либо IEnumerable результатов.

Тем не менее, я хочу, чтобы он возвращал массив Entity, который я выбираю, что было бы лучшим способом выполнить это? Я могу либо перечислить его, либо построить массив, либо использовать CopyTo() определенный массив.

Есть ли лучший способ? Я пошел с подходом CopyTo.

Ответ 1

Какую версию .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;
}

Ответ 2

Добавьте в файл .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();

Ответ 3

Я чувствую, как изобретать колесо...

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

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

Ответ 4

Если у вас нет Linq, я решил его следующим образом:

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

        iList.CopyTo(result, 0);

        return result;
    }

Надеюсь, что это поможет