Лучший способ конвертировать 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;
}
Надеюсь, что это поможет