Avatar
Tayson
Člen
Avatar
Tayson:

Ahojte chcem opytat ked mam takyto kod:

IEnumerable<string> elements = MyIteratorMethod();
foreach (string element in elements)
{

}

Tak co sa mi ulozi do elements este pre vykonanim foreach? Alebo teda aka je postupnost vykonavania tohto programu ? Chcem sa este opytat ze ak mam vlastnu kolekciu ktora implementuje IEnumerable tak mam tam metodu GetEnumerator... znamena to ze mozem si vytvorit triedu vlastnu kde implementujem moveNext, current a tak dalej alebo ju nemusim implementovat a pouzijem v getenumerator metode yield? Dakujem

 
Odpovědět 16. září 20:27
Avatar
Marian Benčat
Redaktor
Avatar
Marian Benčat:

Pro pochopení ti stačí následující vědomosti:

  1. Běžná metoda si nedrží žádnou informaci o sobě po skončení, pokud do ni napíšeš:
return a;
return b;
return c;

a zavoláš ji 3x, trak pokaždé vártí a

  1. Metoda co vrací pomocí yodlování (yield) si pamatuje svuj state (vi, kde skoncila a pri dalsim zavolani tam muze navazat)

yield a;
yield b;
yield c;

ti při každém volání vrátí to další. Takto ji lze už automaticky použít jako IEnumerable kolekci (lze ji navat do foreache)

  1. Pokud chceš implementovat nějakou kolekci, co implementuje to IEnumerable, defakto jen implementuješ GetEnumerator() který má za úkol, vždy vracet další prvek.. Zde lze využít toho, že se pamatuje stav, ve kteérm se skončilo.. uvnitř toho GetEnumerator() máš tedy ve většině případů jinou iteraci skrze všechny prvky, kde v každé iteraci (v každém kole) yieldnes prvek...

Tedy většinou implementace GetEnumerator() je ve stylu:
foreach(a in vnitrniPole) {
yield a;
}

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět 16. září 23:38
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 2 zpráv z 2.