IEnumerable описывает поведение, в то время как List является реализацией этого поведения. Когда вы используете IEnumerable, вы даете компилятору возможность отложить работу на потом, возможно, оптимизируя его. Если вы используете ToList (), вы немедленно заставляете компилятор преобразовывать результаты.
В приведенном вами примере заметной разницы в производительности нет.
Производительность наступает, когда мы используем преимущество отложенного выполнения. LINQ не генерирует SQL для запроса базы данных, пока вы не перечислите его.
Рассмотрим следующий код:
public IEnumerable<Vehicles> CaliEmissionStd()
{
return from a in EPA.RoadVehicles
where a.emissions.CaliEmissions == true
select a;
}
public IEnumerable<Vehicles> Cars(IEnumerable<Vehicles> vehicles)
{
return from a in vehicles
where a.VehType == "Car"
select a;
}
Здесь у нас есть метод, который выбирает все дорожные транспортные средства со стандартом эмиссии cali, и фильтр, который выбирает подсписок типа car.
Поскольку LINQ удерживает построение запроса до тех пор, пока мы его не перечислим, мы можем сделать следующее, чтобы в итоге мы получили один запрос SQL, который запрашивает базу данных и возвращает только соответствующие строки.
var AutosWithCaliEmissionStd = Cars(CaliEmissionStd());
Но если бы мы вернули список из CaliEmissionStd()
, то он работал бы медленнее, потому что база данных возвращала бы данные для всех транспортных средств со стандартом калибровки выбросов (автомобили, внедорожники, грузовики, мотоциклы и т. Д.) Вместопросто Автомобили, заставляя нас тратить впустую циклы / время, делая фильтрацию в клиенте.