Wpis z mikrobloga

via Wykop Mobilny (Android)
  • 0
Czym się różni FirstOrDefault(predykat) na IEnumerable a na List?

Ten pierwszy działa znacznie wolniej. Woła gdzieś w środku ToList() czy jak?

#dotnet #csharp #linq
  • 9
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@harakiri888: IEnumerable moze być tylko "zapytaniem". FirstOrDefault() spowoduje wykonanie go i dopiero na wyniku zostanie uruchomiona petla, z ktorej zostanie zwrocony pierwszy element spelniajacy predykat.

Lista jest juz zmaterializowanym zapytaniem, pod spodem nie bedzie juz filtrowania, zapytania do bazy, niczego. Od razu masz petle ze sprawdzaniem predykatu
  • Odpowiedz
@harakiri888: nie ma to związku z FirstOrDefault(predykat) a bardziej z tym w jaki sposob następuje iterowanie po strukturze danych.

Wykonując to na IEnumerbale korzystasz z IEnumerator IEnumerable.GetEnumerator(), natomiast przy liście będzie to List.Enumerator List.GetEnumerator(). I ten drugi nie jest wirtualny - wolniejszy.

jak masz jeszcze IEnumerable i zawołasz to list to rezygnujesz z deferred execution. też jest "szybciej"
  • Odpowiedz
@MikelThief: IQueryable implementuje IEnumerable. Wiec szcze mowiac nie wiem czym jest "zapytanie".
Glownie to wszystko rozbija sie o 'Deffered Execution' tak jak napisales. Ale co ja bede uczyl ojca dzieci robic, wiesz lepiej ode mnie (ʘʘ)
  • Odpowiedz
@harakiri888 @MikelThief: Wszystkie operacje na IEnumerable typu: Where, Select itd wisza w powietrzu do momentu az zapytasz o jakis element z tej kolekcji albo o kolekcje. Dlatego z braku lepszego slowa te operacje nazwalem "zapytaniem"
  • Odpowiedz