Junior
Jaké typy objektů lze použít v cyklu foreach v C#?
sobes.tech AI
Odpověď od AI
V cyklu foreach v C# lze použít jakýkoli typ objektu, který implementuje jednu z následujících rozhraní:
System.Collections.IEnumerable- pro neobecné kolekce. Poskytuje neobecného enumerátoraIEnumerator.System.Collections.Generic.IEnumerable<T>- pro obecné kolekce. Poskytuje generického enumerátoraIEnumerator<T>.
Třída nebo struktura může být také použita v foreach, pokud má veřejnou metodu GetEnumerator(), která vrací instanci třídy nebo struktury implementující následující podpis (toto se nazývá pattern-based foreach):
- Veřejná vlastnost
Current, která vrací jakýkoli typ. - Veřejná metoda
MoveNext(), která vracíbool. - Volitelně, veřejná metoda
Dispose()(pro správné uvolnění zdrojů při použitíusing).
Příklady vestavěných typů, které lze použít:
- Pole (
int[],string[]atd.) - Kolekce z prostoru jmen
System.Collections:ArrayList,Hashtable,Queue,Stack. - Kolekce z prostoru jmen
System.Collections.Generic:List<T>,Dictionary<TKey, TValue>,HashSet<T>,Queue<T>,Stack<T>. - Řetězce (
string) - jsou posloupností znakůchar.
Příklad vlastního typu, který podporuje foreach podle vzoru:
// Jednoduchý vlastní typ podporující foreach
public class MyEnumerable
{
private int[] data = { 1, 2, 3, 4, 5 };
// Metoda GetEnumerator, která podporuje foreach podle vzoru
public MyEnumerator GetEnumerator()
{
return new MyEnumerator(data);
}
// Vnitřní třída enumerátoru
public class MyEnumerator
{
private int[] data;
private int currentIndex = -1;
public MyEnumerator(int[] data)
{
this.data = data;
}
// Vlastnost Current
public int Current => data[currentIndex];
// Metoda MoveNext
public bool MoveNext()
{
currentIndex++;
return currentIndex < data.Length;
}
// Metoda Dispose (volitelná)
public void Dispose()
{
// Uvolnění zdrojů, pokud je třeba
}
}
}
// Použití v `foreach`
// var collection = new MyEnumerable();
// foreach (var item in collection)
// {
// // Console.WriteLine(item);
// }