Sobes.tech
Junior

Kokius objektų tipus galima naudoti foreach cikle C#?

sobes.tech AI

Atsakymas iš AI

C# kalboje foreach ciklas gali naudoti bet kokio tipo objektus, kurie įgyvendina vieną iš šių sąsajų:

  • System.Collections.IEnumerable - neuniversalioms kolekcijoms. Pateikia neuniversalią IEnumerator enumeratorių.
  • System.Collections.Generic.IEnumerable<T> - universalioms kolekcijoms. Pateikia universalią IEnumerator<T> enumeratorių.

Klasė arba struktūra taip pat gali būti naudojama foreach, jei ji turi viešą metodą GetEnumerator(), kuris grąžina tokį patį objektą, kuris įgyvendina šią signatūrą (vadinama pattern-based foreach):

  • Viešas Current savybė, kuri grąžina bet kokį tipą.
  • Viešas MoveNext() metodas, kuris grąžina bool.
  • Pasirinktinai, viešas Dispose() metodas (teisingam išteklių atlaisvinimui naudojant using).

Pavyzdžiai įmontuotų tipų, kuriuos galima naudoti:

  • Masyvai (int[], string[] ir kt.)
  • Kolekcijos iš System.Collections srities: ArrayList, Hashtable, Queue, Stack.
  • Kolekcijos iš System.Collections.Generic srities: List<T>, Dictionary<TKey, TValue>, HashSet<T>, Queue<T>, Stack<T>.
  • Eilutės (string) - jos yra simbolių char sekos.

Pavyzdys naudotojo tipo, kuris palaiko foreach pagal šabloną:

// Paprastas naudotojo tipas, palaikantis `foreach`
public class MyEnumerable
{
    private int[] data = { 1, 2, 3, 4, 5 };

    // `GetEnumerator` metodas, palaikantis `foreach`
    public MyEnumerator GetEnumerator()
    {
        return new MyEnumerator(data);
    }

    // Vidinis klasės enumeratorius
    public class MyEnumerator
    {
        private int[] data;
        private int currentIndex = -1;

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

        // `Current` savybė
        public int Current => data[currentIndex];

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

        // `Dispose` metodas (pasirinktinai)
        public void Dispose()
        {
            // išlaisvinimas išteklių, jei reikia
        }
    }
}

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