Лучший способ конвертировать IList или IEnumerable в массив - PullRequest
87 голосов
/ 06 ноября 2008

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

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

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

Ответы [ 4 ]

147 голосов
/ 06 ноября 2008

Какую версию .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;
}
40 голосов
/ 18 апреля 2011

Поместите в ваш файл .cs следующее:

using System.Linq;

После этого вы сможете использовать следующий метод расширения из System.Linq.Enumerable:

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

1007 * Т.е. *

IEnumerable<object> query = ...;
object[] bob = query.ToArray();
6 голосов
/ 06 июня 2013

Мне хочется заново изобрести колесо ...

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

    return enumerable as T[] ?? enumerable.ToArray();
}
2 голосов
/ 26 января 2016

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

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

        iList.CopyTo(result, 0);

        return result;
    }

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...