0Pricing
C# Academy · درس

أساليب التكرار باستخدام yield return

ولّدوا تسلسلات عنصرًا واحدًا في كل مرة

أساليب التكرار باستخدام yield return درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C# Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C# Academy 4 دروس في المجموع.

ما أسلوب التكرار؟

ينتج أسلوب التكرار تسلسلًا من القيم، قيمةً تلو الأخرى، باستخدام yield return. يحوّله المصرّف إلى آلة حالات، لذلك لا يتعين عليكم إنشاء قائمة وإدارتها بأنفسكم.

أول استخدام لـ yield return

يعيد كل yield return قيمة واحدة إلى المستدعي ويوقف الأسلوب مؤقتًا. ويُستأنف التنفيذ مباشرةً بعد تلك العبارة في التكرار التالي.

using System;
using System.Collections.Generic;

public class Program
{
    static IEnumerable<int> FirstThree()
    {
        yield return 1;
        yield return 2;
        yield return 3;
    }

    public static void Main()
    {
        foreach (var n in FirstThree())
            Console.WriteLine(n);
    }
}

yield return داخل حلقة

تنتج معظم أساليب التكرار القيم داخل حلقة. نولّد هنا أول count من الأعداد الزوجية من دون تخصيص مجموعة على الإطلاق.

using System;
using System.Collections.Generic;

public class Program
{
    static IEnumerable<int> Evens(int count)
    {
        for (int i = 0; i < count; i++)
            yield return i * 2;
    }

    public static void Main()
    {
        foreach (var n in Evens(5))
            Console.WriteLine(n);
    }
}

يُرجع الأسلوب IEnumerable

يجب أن يُرجع أسلوب التكرار IEnumerable<T> أو IEnumerator<T>، أو النسخ غير العامة منهما. ولا تكتبون أبدًا return مع قيمة؛ بل تستخدمون yield return فقط.

using System;
using System.Collections.Generic;

public class Program
{
    static IEnumerable<string> Greetings()
    {
        yield return "hello";
        yield return "hi";
        yield return "hey";
    }

    public static void Main()
    {
        foreach (var g in Greetings())
            Console.WriteLine(g);
    }
}

يُوقف التنفيذ ويُستأنف

يُحفَظُ تلقائيًا الوضع بين عبارات yield. وتحافظ المتغيرات المحلية على قيمها أثناء فترات التوقف، وهذا ما يجعل إنشاء المجاميع التراكمية أمرًا سهلًا.

using System;
using System.Collections.Generic;

public class Program
{
    static IEnumerable<int> RunningTotal(IEnumerable<int> nums)
    {
        int total = 0;
        foreach (var n in nums)
        {
            total += n;
            yield return total;
        }
    }

    public static void Main()
    {
        foreach (var t in RunningTotal(new[] { 1, 2, 3, 4 }))
            Console.WriteLine(t);
    }
}

إنشاء تسلسلات لا نهائية

بما أن القيم تُنتج عند الطلب، يستطيع أسلوب التكرار وصف تسلسل لا نهائي بأمان. ويحدد المستدعي متى يتوقف عن طلب القيم.

using System;
using System.Collections.Generic;

public class Program
{
    static IEnumerable<int> Naturals()
    {
        int i = 1;
        while (true) yield return i++;
    }

    public static void Main()
    {
        int taken = 0;
        foreach (var n in Naturals())
        {
            Console.WriteLine(n);
            if (++taken == 5) break;
        }
    }
}

تحويل تسلسل إدخال

تتألق أساليب التكرار عند إنشاء مسارات معالجة: اقرأوا العناصر من تسلسل، وحوّلوها، ثم أرجعوا النتائج بصورة كسولة.

using System;
using System.Collections.Generic;

public class Program
{
    static IEnumerable<string> Labelled(IEnumerable<int> nums)
    {
        foreach (var n in nums)
            yield return "item-" + n;
    }

    public static void Main()
    {
        foreach (var s in Labelled(new[] { 10, 20, 30 }))
            Console.WriteLine(s);
    }
}

التصفية باستخدام أساليب التكرار

للتصفية، أرجعوا فقط العناصر التي تريدونها. فلا تُنتج العناصر المتخطاة أبدًا، وبالتالي لا تراها الشفرة اللاحقة.

using System;
using System.Collections.Generic;

public class Program
{
    static IEnumerable<int> OnlyPositive(IEnumerable<int> nums)
    {
        foreach (var n in nums)
            if (n > 0) yield return n;
    }

    public static void Main()
    {
        foreach (var n in OnlyPositive(new[] { -2, 5, -1, 8 }))
            Console.WriteLine(n);
    }
}

ينشئ المصرّف آلة حالات

خلف الكواليس، يعيد المصرّف كتابة أسلوب التكرار ليصبح صنفًا يطبّق IEnumerator<T>، مع تتبع حقل حالة مخفي وقيمة Current. وتحصلون على كل هذه الآلية مجانًا.

using System;
using System.Collections.Generic;

public class Program
{
    static IEnumerable<char> Letters()
    {
        yield return 'a';
        yield return 'b';
        yield return 'c';
    }

    public static void Main()
    {
        IEnumerator<char> e = Letters().GetEnumerator();
        while (e.MoveNext())
            Console.WriteLine(e.Current);
    }
}

تركيب عدة أساليب تكرار

تترابط أساليب التكرار طبيعيًا لأن كل واحد منها يُرجع IEnumerable<T>. مرّروا ناتج أسلوب تكرار إلى التالي لإنشاء مسارات معالجة واضحة.

using System;
using System.Collections.Generic;

public class Program
{
    static IEnumerable<int> Range(int start, int count)
    {
        for (int i = 0; i < count; i++) yield return start + i;
    }
    static IEnumerable<int> Squares(IEnumerable<int> nums)
    {
        foreach (var n in nums) yield return n * n;
    }

    public static void Main()
    {
        foreach (var n in Squares(Range(1, 4)))
            Console.WriteLine(n);
    }
}

جرّبوا بأنفسكم

اكتبوا أسلوب تكرار يقسم تسلسل إدخال إلى أجزاء ثابتة الحجم. فهو يُرجع القوائم عند الطلب، ويُظهر مقدار المنطق الذي يمكن وضعه في أسلوب تكرار واحد ومنظم.

using System;
using System.Collections.Generic;

public class Program
{
    static IEnumerable<List<int>> Batch(IEnumerable<int> source, int size)
    {
        var bucket = new List<int>();
        foreach (var n in source)
        {
            bucket.Add(n);
            if (bucket.Count == size) { yield return bucket; bucket = new List<int>(); }
        }
        if (bucket.Count > 0) yield return bucket;
    }

    public static void Main()
    {
        foreach (var group in Batch(new[] { 1, 2, 3, 4, 5 }, 2))
            Console.WriteLine(string.Join(",", group));
    }
}

تحقق سريع

تذكّروا كيفية عمل أساليب التكرار.

مراجعة

تستخدم أساليب التكرار yield return لإنتاج التسلسلات عند الطلب.

  • يُرجع الأسلوب IEnumerable<T> أو IEnumerator<T>.
  • تُصدر كل عبارة yield return قيمة واحدة وتوقف التنفيذ مؤقتًا، مع الحفاظ على الحالة المحلية.
  • يمكنها وصف تسلسلات لا نهائية بأمان.
  • ينشئ المصرّف آلة الحالات نيابةً عنكم.

الأسئلة الشائعة

هل درس «أساليب التكرار باستخدام yield return» مجاني؟

نعم — نص درس «أساليب التكرار باستخدام yield return» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 4 دروس في المجموع.

ماذا ستتعلم في «أساليب التكرار باستخدام yield return»؟

ولّدوا تسلسلات عنصرًا واحدًا في كل مرة تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟

لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «أساليب التكرار باستخدام yield return»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟

نعم. كل درس في C# Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. أساليب التكرار باستخدام yield return
  2. ‏yield break والإنهاء المبكر
  3. دلالات التقييم الكسول
  4. الأنواع القابلة للتعداد المخصّصة
← العودة إلى C# Academy