Лучший способ конвертировать IEnumerable <T>в T [] - PullRequest
8 голосов
/ 31 января 2009

Каков наилучший способ преобразования общей реализации IEnumerable<T> в массив T? Текущее решение, которое у меня есть, выглядит следующим образом:

IEnumerable<string> foo = getFoo();
string[] bar = new List<string>(foo).ToArray();

Перевод через List<T> кажется ненужным, но я не смог найти лучшего способа сделать это.

Примечание: я работаю в C # 2.0 здесь.

Ответы [ 4 ]

14 голосов
/ 31 января 2009

.NET 3.0 и после:

Вызовите метод расширения ToArray для IEnumerable<T>, он выполняет почти то же действие, что и ниже, выполняет анализ типа и некоторые другие оптимизации.

.NET 2.0 и ранее:

Вообще говоря, использование List<T>, которое будет инициализировано с IEnumerable<T>, а затем вызов ToArray, является, вероятно, самым простым способом сделай это.

Конструктор для List<T> проверит IEnumerable<T>, чтобы увидеть, реализует ли он ICollection<T>, чтобы получить количество элементов для правильной инициализации емкости списка. Если нет, он будет расширяться как обычно.

Конечно, вы можете в конечном итоге создать несколько List<T> экземпляров только для преобразования IEnumerable<T> в T[]. Для этого вы можете написать свой собственный метод, но на самом деле вы просто дублируете код, уже существующий в List<T>.

5 голосов
/ 02 февраля 2009

Делая маленький .NET Reflector, похоже, что метод расширения Linq ToArray делает то же самое, что и пропуск IEnumerable через List <>. Класс Buffer является внутренним, но поведение кажется очень похожим на List <>.

public static TSource[] ToArray<TSource>(this IEnumerable<TSource> source)
{
    if (source == null)
    {
        throw Error.ArgumentNull("source");
    }
    Buffer<TSource> buffer = new Buffer<TSource>(source);
    return buffer.ToArray();
}
0 голосов
/ 04 ноября 2013
// src is IEnumerable<T>
// target is T[]
target = src == null ? new T[] {} : src.ToArray();
0 голосов
/ 31 января 2009

Если нет способа определить длину массива, то это лучший способ.

В IEnumerable нет ничего, что позволило бы вам определять длину, но, возможно, у вашего кода есть способ найти другой способ. Если это так, используйте это для создания массива.

...