Кастинг IEnumerable <T> для списка <T>

Мне было интересно, можно ли включить IEnumerable в список. Есть ли способ сделать это, кроме копирования каждого элемента в список?

Ответы

Ответ 1

Как уже было сказано, используйте yourEnumerable.ToList(). Он перечисляет ваш IEnumerable, сохраняя содержимое в новом List. Вы не обязательно копируете существующий список, так как ваш IEnumerable может генерировать элементы лениво.

Это то, что предлагают другие ответы, но более ясные. Здесь разборки, чтобы вы могли быть уверены:

public static List<TSource> ToList<TSource>(this IEnumerable<TSource> source)
{
    if (source == null)
    {
        throw Error.ArgumentNull("source");
    }
    return new List<TSource>(source);
}

Ответ 3

Как и другие, просто используйте метод ToList() для перечислимого объекта:

var myList = myEnumerable.ToList()

Но если ваш объект IEnumerable не имеет метода ToList(), и вы получаете сообщение об ошибке, как показано ниже:

'IEnumerable' не содержит определения для 'ToList'

вам, вероятно, не хватает пространства имен System.Linq, поэтому просто добавьте его:

using System.Linq

Ответ 4

Создайте новый список и передайте старый IEnumerable в его инициализатор:

    IEnumerable<int> enumerable = GetIEnumerable<T>();
    List<int> list = new List<int>(enumerable);

Ответ 5

нет, вы должны скопировать, если вы уверены, что ссылка является ссылкой на список, вы можете конвертировать как это

List<int> intsList = enumIntList as List<int>;