IEnumerable
описывает поведение, в то время как List является реализацией этого поведения.Когда вы используете IEnumerable
, вы даете компилятору возможность отложить работу на потом, возможно, оптимизируя его.Если вы используете ToList (), вы заставляете компилятор сразу преобразовывать результаты.
Всякий раз, когда я "складываю" выражения LINQ, я использую IEnumerable
, потому что, только указав поведение, я даю LINQ шансотложить оценку и, возможно, оптимизировать программу.Помните, как LINQ не генерирует SQL для запроса базы данных, пока вы не перечислите его?Учтите это:
public IEnumerable<Animals> AllSpotted()
{
return from a in Zoo.Animals
where a.coat.HasSpots == true
select a;
}
public IEnumerable<Animals> Feline(IEnumerable<Animals> sample)
{
return from a in sample
where a.race.Family == "Felidae"
select a;
}
public IEnumerable<Animals> Canine(IEnumerable<Animals> sample)
{
return from a in sample
where a.race.Family == "Canidae"
select a;
}
Теперь у вас есть метод, который выбирает начальный образец («AllSpotted»), а также некоторые фильтры.Итак, теперь вы можете сделать это:
var Leopards = Feline(AllSpotted());
var Hyenas = Canine(AllSpotted());
Так быстрее ли использовать List над IEnumerable
?Только если вы хотите предотвратить выполнение запроса более одного раза.Но лучше ли это в целом?Как уже было сказано выше, леопарды и гиены преобразуются в отдельные запросы SQL каждый , а база данных возвращает только соответствующие строки.Но если бы мы вернули List из AllSpotted()
, то он может работать медленнее, потому что база данных может вернуть гораздо больше данных, чем фактически необходимо, и мы тратим циклы, выполняя фильтрацию в клиенте.
В программеможет быть лучше отложить преобразование вашего запроса в список до самого конца, поэтому, если я собираюсь перечислять леопардов и гиен несколько раз, я бы сделал это:
List<Animals> Leopards = Feline(AllSpotted()).ToList();
List<Animals> Hyenas = Canine(AllSpotted()).ToList();