Sobes.tech
Junior

Дар C#, кадом намудҳои объектҳоро метавон дар давраи foreach истифода бурд?

sobes.tech AI

Ҷавоб аз AI

Дар сикли foreach дар C# метавон истифода бурд ҳар кадом намудҳои объектҳо, ки яке аз интерфейсҳои зеринро иҷро мекунанд:

  • System.Collections.IEnumerable - барои ҷамъиятҳои ғайриуниверсалӣ. ОнEnumerator-и ғайриуниверсалӣ IEnumerator-ро пешниҳод мекунад.
  • System.Collections.Generic.IEnumerable<T> - барои ҷамъиятҳои универсалӣ. ОнEnumerator-и универсалӣ 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);
// }