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, რომელიც აბრუნებს ნებისმიერ ტიპს.
  • საჯარო მეთოდი 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);
    }

    // შიდა კლასი - ენუმერატორი
    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);
// }