Junior
C# да foreach циклинде кайсы объекттер колдонулушу мүмкүн?
sobes.tech AI
AIден жооп
C# тилиндеги foreach цикли үчүн, төмөнкү интерфейстердин бирин ишке ашырган ар кандай объекттердин түрлөрүн колдонууга болот:
System.Collections.IEnumerable- универсалдуу эмес коллекциялар үчүн. АлIEnumeratorтипиндеги универсалдуу эмес тизмектөөнү камсыздайт.System.Collections.Generic.IEnumerable<T>- универсалдуу коллекциялар үчүн. АлIEnumerator<T>типиндеги универсалдуу тизмектөөнү камсыздайт.
Класс же структура foreach ичинде колдонулушу мүмкүн, эгерде ал GetEnumerator() деп аталган коомдук ыкмасын камтыса, ал төмөнкү синтаксисте ишке ашкан объектти кайтарат (бул pattern-based foreach деп аталат):
- Бардык түрдү кайтарган коомдук
Currentмүчөсү. boolкайтарган коомдукMoveNext()ыкмасы.- Опционалдуу,
Dispose()деп аталган коомдук ыкма (ресурстарды туура бошотуу үчүн,usingменен колдонууда).
Келтирилген мисалдар:
- Масивдер (
int[],string[]жана башка) System.Collectionsкеңейтүүсүндөгү коллекциялар:ArrayList,Hashtable,Queue,Stack.System.Collections.Genericкеңейтүүсүндөгү коллекциялар:List<T>,Dictionary<TKey, TValue>,HashSet<T>,Queue<T>,Stack<T>.- Жолдор (
string) - аларcharсимволдорунун тизмеси.
Колдонуучу түрүнүн мисалы, ал foreach менен иштей алат:
// Жөнөкөй колдонуучу түр, `foreach` колдоого алат
public class MyEnumerable
{
private int[] data = { 1, 2, 3, 4, 5 };
// `GetEnumerator` ыкмасы, `foreach` үчүн иштейт
public MyEnumerator GetEnumerator()
{
return new MyEnumerator(data);
}
// ички класс - тизмектөөчү
public class MyEnumerator
{
private int[] data;
private int currentIndex = -1;
public MyEnumerator(int[] data)
{
this.data = data;
}
// `Current` мүчөсү
public int Current => data[currentIndex];
// `MoveNext` ыкмасы
public bool MoveNext()
{
currentIndex++;
return currentIndex < data.Length;
}
// `Dispose` ыкмасы (опционалдуу)
public void Dispose()
{
// ресурстарды бошотуу, керек болсо
}
}
}
// `foreach` колдонуу
// var collection = new MyEnumerable();
// foreach (var item in collection)
// {
// // Console.WriteLine(item);
// }