Akademi C# · Pelajaran

Kaedah Lelaran dengan yield return

Jana jujukan satu unsur pada satu masa.

Pelajaran 1 daripada 413 langkah

Kaedah Lelaran dengan yield return ialah pelajaran Akademi C# percuma di CoddyKit. Ini ialah pelajaran 1 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Akademi C#, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Akademi C# merangkumi sejumlah 4 pelajaran.

Apakah Kaedah Lelaran?

Kaedah lelaran menghasilkan jujukan nilai satu demi satu menggunakan yield return. Pengompil menukarkannya menjadi mesin keadaan, jadi anda tidak perlu membina dan mengurus senarai sendiri.

Pemulangan Nilai Pertama

Setiap yield return menyerahkan satu nilai kepada pemanggil dan menjeda kaedah tersebut. Pelaksanaan bersambung semula tepat selepas pernyataan itu pada lelaran seterusnya.

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);
    }
}

Menghasilkan Nilai dalam Gelung

Kebanyakan kaedah lelaran menghasilkan nilai dari dalam gelung. Di sini kita menjana count nombor genap pertama tanpa pernah memperuntukkan koleksi.

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);
    }
}

Kaedah Mengembalikan IEnumerable

Kaedah lelaran mesti mengembalikan IEnumerable<T> atau IEnumerator<T>, termasuk versi bukan generik. Anda tidak pernah menulis return dengan nilai; anda hanya menggunakan 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);
    }
}

Pelaksanaan Dijeda dan Disambung Semula

Keadaan antara pemulangan nilai disimpan secara automatik. Pemboleh ubah setempat mengekalkan nilainya merentasi jeda, dan inilah yang memudahkan penjanaan jumlah terkumpul.

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);
    }
}

Menjana Jujukan Tidak Terhingga

Oleh sebab nilai dihasilkan apabila diminta, kaedah lelaran boleh menerangkan jujukan tidak terhingga dengan selamat. Pemanggil menentukan masa untuk berhenti mendapatkan nilai.

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;
        }
    }
}

Mengubah Jujukan Masukan

Kaedah lelaran sangat sesuai untuk membina saluran paip: baca item daripada satu jujukan, ubah item tersebut dan hasilkan hasilnya secara tertunda.

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);
    }
}

Menapis dengan Lelaran

Untuk menapis, hasilkan sahaja item yang anda kehendaki. Item yang dilangkau tidak pernah dihasilkan, jadi kod seterusnya tidak akan melihatnya.

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);
    }
}

Pengompil Membina Mesin Keadaan

Di sebalik tabir, pengompil menulis semula kaedah lelaran anda menjadi kelas yang melaksanakan IEnumerator<T>, sambil menjejaki medan keadaan tersembunyi dan nilai Current. Anda mendapat semua mekanisme itu secara percuma.

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);
    }
}

Menggabungkan Beberapa Lelaran

Kaedah lelaran mudah dirangkaikan kerana setiap satunya mengembalikan IEnumerable<T>. Salurkan keluaran satu kaedah lelaran ke kaedah seterusnya untuk membina saluran paip yang mudah dibaca.

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);
    }
}

Cuba Sendiri

Tulis kaedah lelaran yang mengelompokkan jujukan masukan kepada cebisan bersaiz tetap. Kaedah itu menghasilkan senarai apabila diminta dan menunjukkan betapa banyak logik yang boleh dimuatkan dalam satu kaedah lelaran yang kemas.

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));
    }
}

Semakan Ringkas

Ingat kembali cara kaedah lelaran berfungsi.

Ringkasan

Kaedah lelaran menggunakan yield return untuk menghasilkan jujukan apabila diminta.

  • Kaedah itu mengembalikan IEnumerable<T> atau IEnumerator<T>.
  • Setiap yield return menghasilkan satu nilai dan menjeda pelaksanaan sambil mengekalkan keadaan setempat.
  • Kaedah ini boleh menerangkan jujukan tidak terhingga dengan selamat.
  • Pengompil menjana mesin keadaan untuk anda.
Percuma untuk bermula

Pelajari C# dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
93
Pelajaran
346

Soalan Lazim

Adakah pelajaran “Kaedah Lelaran dengan yield return” percuma?

Ya — teks penuh “Kaedah Lelaran dengan yield return” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Akademi C#, tingkat taraf kepada CoddyKit PRO. Kursus Akademi C# merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Kaedah Lelaran dengan yield return”?

Jana jujukan satu unsur pada satu masa. Anda berlatih Akademi C# menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Akademi C#?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Akademi C# di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 1 daripada 4.

Berapa lamakah pelajaran “Kaedah Lelaran dengan yield return” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Akademi C# ini?

Ya. Setiap pelajaran Akademi C# menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Kaedah Lelaran dengan yield return
  2. yield break dan Penamatan Awal
  3. Semantik Penilaian Malas
  4. Jenis Enumerasi Tersuai
← Kembali ke Akademi C#