Sobes.tech
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);
// }