Sobes.tech
Junior

Ինչ տեսակ օբյեկտներ կարելի է օգտագործել C#-ում foreach ցիկլում?

sobes.tech AI

Պատասխան AI-ից

Կոդի foreach ցիկլը C#-ում կարող է օգտագործել ցանկացած օբյեկտի տեսակ, որը իրականացնում է հետևյալ ինտերֆեյսներից մեկը՝

  • System.Collections.IEnumerable - ոչ-համընդհանուր հավաքածուների համար: ապահովում է ոչ-համընդհանուր IEnumerator ցուցակագրիչ:
  • System.Collections.Generic.IEnumerable<T> - համընդհանուր հավաքածուների համար: ապահովում է համընդհանուր IEnumerator<T> ցուցակագրիչ:

Կլասը կամ կառուցվածքը կարող է նաև օգտագործվել foreach-ում, եթե ունենում է հանրային GetEnumerator() մեթոդ, որը վերադարձնում է հետևյալ սինթաքսին համապատասխան օբյեկտի օրինակ (այսպես կոչվում է pattern-based foreach):

  • Հանրային Current հատկություն, որը վերադարձնում է ցանկացած տիպ:
  • Հանրային MoveNext() մեթոդ, որը վերադարձնում է bool:
  • Ընտրովի, հանրային 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);
    }

    // ներքին դաս - enumeration
    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);
// }