Junior
Kokius objektų tipus galima naudoti foreach cikle C#?
sobes.tech AI
Atsakymas iš AI
C# kalboje foreach ciklas gali naudoti bet kokio tipo objektus, kurie įgyvendina vieną iš šių sąsajų:
System.Collections.IEnumerable- neuniversalioms kolekcijoms. Pateikia neuniversaliąIEnumeratorenumeratorių.System.Collections.Generic.IEnumerable<T>- universalioms kolekcijoms. Pateikia universaliąIEnumerator<T>enumeratorių.
Klasė arba struktūra taip pat gali būti naudojama foreach, jei ji turi viešą metodą GetEnumerator(), kuris grąžina tokį patį objektą, kuris įgyvendina šią signatūrą (vadinama pattern-based foreach):
- Viešas
Currentsavybė, kuri grąžina bet kokį tipą. - Viešas
MoveNext()metodas, kuris grąžinabool. - Pasirinktinai, viešas
Dispose()metodas (teisingam išteklių atlaisvinimui naudojantusing).
Pavyzdžiai įmontuotų tipų, kuriuos galima naudoti:
- Masyvai (
int[],string[]ir kt.) - Kolekcijos iš
System.Collectionssrities:ArrayList,Hashtable,Queue,Stack. - Kolekcijos iš
System.Collections.Genericsrities:List<T>,Dictionary<TKey, TValue>,HashSet<T>,Queue<T>,Stack<T>. - Eilutės (
string) - jos yra simboliųcharsekos.
Pavyzdys naudotojo tipo, kuris palaiko foreach pagal šabloną:
// Paprastas naudotojo tipas, palaikantis `foreach`
public class MyEnumerable
{
private int[] data = { 1, 2, 3, 4, 5 };
// `GetEnumerator` metodas, palaikantis `foreach`
public MyEnumerator GetEnumerator()
{
return new MyEnumerator(data);
}
// Vidinis klasės enumeratorius
public class MyEnumerator
{
private int[] data;
private int currentIndex = -1;
public MyEnumerator(int[] data)
{
this.data = data;
}
// `Current` savybė
public int Current => data[currentIndex];
// `MoveNext` metodas
public bool MoveNext()
{
currentIndex++;
return currentIndex < data.Length;
}
// `Dispose` metodas (pasirinktinai)
public void Dispose()
{
// išlaisvinimas išteklių, jei reikia
}
}
}
// Naudojimas `foreach`
// var collection = new MyEnumerable();
// foreach (var item in collection)
// {
// // Console.WriteLine(item);
// }