Junior
Aké typy objektov je možné použiť v cykle foreach v C#?
sobes.tech AI
Odpoveď od AI
V slučajevu foreach v jazyku C# je možné použiť akékoľvek typy objektov, ktoré implementujú jeden z nasledujúcich rozhraní:
System.Collections.IEnumerable- pre neuniverzálne kolekcie. Poskytuje neuniverzálneho enumerátoraIEnumerator.System.Collections.Generic.IEnumerable<T>- pre univerzálne kolekcie. Poskytuje univerzálneho enumerátoraIEnumerator<T>.
Trieda alebo štruktúra môžu byť tiež použité v foreach, ak majú verejnú metódu GetEnumerator(), ktorá vracia inštanciu triedy/štruktúry implementujúcej nasledujúcu signatúru (toto sa nazýva pattern-based foreach):
- Verejná vlastnosť
Current, ktorá vracia akýkoľvek typ. - Verejná metóda
MoveNext(), ktorá vraciabool. - Voliteľne, verejná metóda
Dispose()(pre správne uvoľnenie zdrojov pri použitíusing).
Príklady vstavaných typov, ktoré je možné použiť:
- Polia (
int[],string[]a pod.) - Kolekcie z priestoru mien
System.Collections:ArrayList,Hashtable,Queue,Stack. - Kolekcie z priestoru mien
System.Collections.Generic:List<T>,Dictionary<TKey, TValue>,HashSet<T>,Queue<T>,Stack<T>. - Riadky (
string) - sú to sekvencie znakovchar.
Príklad používateľského typu, ktorý podporuje foreach podľa vzoru:
// Jednoduchý používateľský typ, ktorý podporuje foreach
public class MyEnumerable
{
private int[] data = { 1, 2, 3, 4, 5 };
// Metóda GetEnumerator, ktorá podporuje foreach podľa vzoru
public MyEnumerator GetEnumerator()
{
return new MyEnumerator(data);
}
// Vnorená trieda - enumerátor
public class MyEnumerator
{
private int[] data;
private int currentIndex = -1;
public MyEnumerator(int[] data)
{
this.data = data;
}
// Vlastnosť Current
public int Current => data[currentIndex];
// Metóda MoveNext
public bool MoveNext()
{
currentIndex++;
return currentIndex < data.Length;
}
// Metóda Dispose (voliteľná)
public void Dispose()
{
// Uvoľnenie zdrojov, ak je potrebné
}
}
}
// Použitie v foreach
// var collection = new MyEnumerable();
// foreach (var item in collection)
// {
// // Console.WriteLine(item);
// }