NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
Majkel
Člen
Avatar
Majkel:12.6.2017 11:32

Ahoj, mohl bych poprosit o nějaké praktické ukázky využít delegátů Func a Action. Vím, jak to ten konstrukt funguje, ale pořád tápu, co se týče nějakého praktického využití při psaní kódu. Díky za tipy a ukázky.

 
Odpovědět
12.6.2017 11:32
Avatar
zelvicek
Člen
Avatar
zelvicek:12.6.2017 12:40

Třeba toto:

namespace System.Linq
{
public static class EnumerableEx
{
internal static IEnumerable<T> LateInit<T>(Fun­c<IEnumerable<T>> initFunc)
{
return new LateInitEnume­rable<T>(init­Func);
}
}

class LateInitEnume­rable<T> : IEnumerable<T>
{
Func<IEnumera­ble<T>> _initFunc;
internal LateInitEnume­rable(Func<IE­numerable<T>> initFunc)
{
_initFunc = initFunc;
}

IEnumerable<T> _source;
bool _sourceTaken;
public IEnumerator<T> GetEnumerator()
{
if (!_sourceTaken)
{
_sourceTaken = true;
_source = _initFunc();
}
return _source.GetEnu­merator();
}

IEnumerator IEnumerable.Ge­tEnumerator()
{
return this.GetEnume­rator();
}
}
}

Mějme methodu ProcessData(I­Enumerable<Va­lue> data).
Pokud zavolám ProcessData(Db­.GetData()), data se z DB získají okamžitě a jsou poslány do methody.
Pokud ovšem existuje možnost, že data nebudou v method zpracovávána, zavolám ji ProcessData(E­numerableEx
.LateInit( ( ) => Db.GetData())) a data budou načtena až při jejich enumeraci.

Omlouvám se za formátování, nevím, zda to lze prezentovat nějak rozumně.

Editováno 12.6.2017 12:42
 
Nahoru Odpovědět
12.6.2017 12:40
Avatar
Odpovídá na zelvicek
Michal Štěpánek:12.6.2017 12:56

Druhé tlačítko zleva je "</>" ==> "vložit zdrojový kód".

Nahoru Odpovědět
12.6.2017 12:56
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na zelvicek
Jan Vargovský:12.6.2017 13:43

Tohle už za tebe ale dělá deffered execution lol.

 
Nahoru Odpovědět
12.6.2017 13:43
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Majkel
Jan Vargovský:12.6.2017 13:49

Nejčastěji to uvidíš v LINQu, který umí dělat projekce, selekce, ... Praktická ukázka je třeba

Lazy<T>(Func<T>)

Máš náročný zdroj, který ne vždycky potřebuješ, tak tomu jen předáš delegáta jakým způsobem se má vytvořit (simuluje to factory method pattern s využitím lazy load). A pak samozřejmě události samotné. Je dobrá chápat rozdíl mezi delegátem a eventem.

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
12.6.2017 13:49
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.