Voordat we ingaan op het verschil tussen IEnumerable en IEnumerator, moeten we eerst de termen Enumerator en Enumerable begrijpen en wanneer en waarom ze gebruiken.
Enumerable is een module die wordt gebruikt in de klasse Array en die u Enumerator geeft. De klasse zelf doet niet elke methode. In feite gebruikt het een methode genaamd 'GetEnumerator' die u een Enumerator geeft om zijn item op te halen.
Een Enumerator is een object dat elk item in een verzameling in een specifieke volgorde retourneert, precies zoals ze worden gevraagd. De compiler genereert code die een Enumerator gebruikt, wanneer je een foreach-lus schrijft in C #.
IEnumerator is een interface geïmplementeerd door een enumerator en de opsombare klasse implementeert de IEnumerable interface.
IEnumerable is een basisinterface die wordt gebruikt om een object te verkrijgen dat weet hoe het moet worden opgesomd (of itereert) over de elementen in de verzameling.
Het is een implementatie van het iteratorpatroon dat een mechanisme biedt om een object in de verzameling te doorkruizen, ongeacht de interne structuur. De IEnumerable interface vertegenwoordigt een object dat kan worden herhaald in een verzameling.
Het gebruikt slechts één methode "GetEnumerator" die een enumerator-klasse-instantie retourneert die de IEnumerator-interface implementeert.
De IEnumerator-interface, enerzijds, verklaart twee methoden - Reset () en MoveNext () - en één eigenschap, Current. De MoveNext () retourneert een Booleaanse waarde die het einde van de lijst aangeeft en helpt bij het plaatsen van het eerste element in de lijst nadat de methode Reset () is aangeroepen: de opsommator wordt ingesteld op de standaardpositie, zodat de lijst opnieuw wordt geanateerd begin.
De huidige eigenschap kan alleen worden aangeroepen via een instantie van de IEnumerator-interface en retourneert het huidige element in de lijst.
Zowel IEnumerable als IEnumerator zijn interfaces die samen het iterator-softwareontwerppatroon in het .Net Framework implementeren. Het .Net Framework maakt toegang tot individuele elementen in de aangepaste verzameling terwijl IEnumerable en IEnumerator interfaces worden geïmplementeerd. De IEnumerable interface declareert slechts één methode genaamd GetEnumerator die een ander type interface retourneert, de IEnumerator-interface voor die specifieke verzameling. IEnumerator, aan de andere kant, is de basisinterface voor alle niet-generieke enumerators die worden gebruikt om de gegevens in de verzameling te lezen. Tellers kunnen echter niet worden gebruikt om de onderliggende verzameling te wijzigen.
IEnumerable interface definieert slechts één methode GetEnumerator () die een instantiemethode is die wordt gebruikt op verschillende soorten verzamelingen. Het krijgt een IEnumerator-iterator die kan worden gebruikt om alle waarden uit de verzameling te herhalen. Wanneer u een foreach-lus in C # schrijft, genereert deze de methode GetEnumerator om de Enumerator te maken die door de lus wordt gebruikt.
IEnumerator gebruikt daarentegen twee methoden MoveNext () en Reset () en een eigenschap Current. De methode MoveNext () neemt de teller mee naar het volgende element van de verzameling, terwijl de methode Reset () de opcentrale instelt op de standaardpositie die vóór het eerste element in de verzameling ligt.
IEnumerable is een generieke interface die een abstractie biedt voor luselementen en door de IEnumerable interface te implementeren, maakt een generieke klasse in wezen iteratie mogelijk via de IEnumerator-interface. Hierdoor krijgen deze klassen uiteindelijk een gemeenschappelijke interface om een exemplaar van een IEnumerator-object op te halen dat alle basisset navigatiemethoden ondersteunt.
IEnumerator is de basisinterface voor enumerators en het gebruik van IEnumerable interface vereist dat de klasse de IEnumerator moet implementeren. Beide interfaces moeten worden geïmplementeerd als u foreach ondersteuning wilt bieden. De abstracte klasse 'AbstractEnumerator' implementeert de IEnumerator-interface.
Met de IEnumerable interface, samen met de ondersteunende IEnumerator-interface, kunt u de elementen in de stapel herhalen met behulp van de instructie 'foreach'. Het is de basisinterface die wordt gebruikt voor objecten van het collectietype. De iteratie begint met het bovenste element in de stapel en eindigt met het oudste element in de stapel. Simpel gezegd, het vertegenwoordigt een object dat kan worden opgesomd.
Samen met de IEnumerator-interface kunnen de ArrayList-elementen op een gestandaardiseerde, sequentiële manier worden herhaald, beginnend bij het eerste element en in de toekomst. De foreach-instructie gebruikt de methoden en eigenschappen van de IEnumerator-interface om alle elementen in een verzameling te herhalen.
In een notendop zijn zowel IEnumerable als IEnumerator interfaces die worden gebruikt om een klasse op te sommen die een verzamelingsaard heeft, wat inhoudt dat ze iteratieve toegang in een aangepaste verzameling faciliteren. IEnumerable is de generieke interface die beschikbaar is voor collectietypen en door de IEnumerable-interface te implementeren, maakt een generieke klasse in principe iteratie mogelijk via de IEnumerator-interface. Het gebruikt slechts één methode GetEnumerator die een enumerator-klasse-instantie retourneert die de IEnumerator-interface implementeert. IEnumerator-interface is bedoeld om te worden gebruikt als accessors en kan niet worden gebruikt om de onderliggende verzameling aan te passen. Het biedt twee abstracte methoden Reset () en MoveNext () en een eigenschap Current om een bepaald element in een verzameling aan te roepen.