Sobes.tech
Junior

Kādus objektu tipus var izmantot foreach ciklā C#?

sobes.tech AI

Atbilde no AI

C# valodā foreach cikls var izmantot jebkura veida objektus, kas realizē vienu no šiem interfeisiem:

  • System.Collections.IEnumerable - neuniversālām kolekcijām. Nodrošina neuniversālo IEnumerator enumeratoru.
  • System.Collections.Generic.IEnumerable<T> - universālām kolekcijām. Nodrošina universālo IEnumerator<T> enumeratoru.

Klase vai struktūra arī var tikt izmantota foreach, ja tai ir publiska metode GetEnumerator(), kas atgriež šādu pašu objektu, kas realizē šo signatūru (to sauc par pattern-based foreach):

  • Publiska Current īpašība, kas atgriež jebkuru tipu.
  • Publiska MoveNext() metode, kas atgriež bool.
  • Opciju, publiska Dispose() metode (pareizai resursu atbrīvošanai, izmantojot using).

Piemēri iebūvētiem tipiem, kurus var izmantot:

  • Masīvi (int[], string[] un tā tālāk)
  • Kolekcijas no System.Collections telpas: ArrayList, Hashtable, Queue, Stack.
  • Kolekcijas no System.Collections.Generic telpas: List<T>, Dictionary<TKey, TValue>, HashSet<T>, Queue<T>, Stack<T>.
  • Virknes (string) - tās ir rakstzīmju secība char.

Piemērs lietotāja tipam, kas atbalsta foreach pēc šablona:

// Vienkāršs lietotāja tips, kas atbalsta `foreach`
public class MyEnumerable
{
    private int[] data = { 1, 2, 3, 4, 5 };

    // `GetEnumerator` metode, kas atbalsta `foreach`
    public MyEnumerator GetEnumerator()
    {
        return new MyEnumerator(data);
    }

    // Iekšējā klase - enumerators
    public class MyEnumerator
    {
        private int[] data;
        private int currentIndex = -1;

        public MyEnumerator(int[] data)
        {
            this.data = data;
        }

        // `Current` īpašība
        public int Current => data[currentIndex];

        // `MoveNext` metode
        public bool MoveNext()
        {
            currentIndex++;
            return currentIndex < data.Length;
        }

        // `Dispose` metode (neobligāti)
        public void Dispose()
        {
            // resursu atbrīvošana, ja nepieciešams
        }
    }
}

// Izmanto `foreach`
// var collection = new MyEnumerable();
// foreach (var item in collection)
// {
//     // Console.WriteLine(item);
// }