C# “yield return” 简化迭代并提高代码质量

C# 提供了各种功能,使编码更加高效和可读。其中一个功能是 statement,它在简化迭代器的创建方面起着至关重要的作用。yield return
什么?yield returnyield return是在 C# 中的迭代器方法上下文中使用的关键字组合。迭代器是一种通常返回 or 的方法,它懒惰地生成一系列值,根据请求一次生成一个元素。这在处理大型数据集或想要动态生成值时特别有用。IEnumerableIEnumerable示例:无yield return考虑这样一个场景:您希望在不使用 的情况下生成一个方块列表。yield returnusing System;

using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        // Without yield return
        foreach (var square in GenerateSquaresWithoutYield(5))
        {
            Console.WriteLine(square);
        }
    }
    public static IEnumerable<int> GenerateSquaresWithoutYield(int count)
    {
        List<int> squares = new List<int>();
        for (int i = 1; i <= count; i++)
        {
            squares.Add(i * i);
        }
        return squares;
    }
}

在此示例中,在返回之前生成整个方格列表并将其存储在内存中。在处理大型数据集时,此方法可能效率低下。示例:使用yield return现在,让我们看看如何使用 更有效地完成相同的任务。
yield returnusing System;

using System.Collections.Generic;
public class Program
{
    public static void Main()
    {
        // Using yield return
        foreach (var square in GenerateSquaresWithYield(5))
        {
            Console.WriteLine(square);
        }
    }
    public static IEnumerable<int> GenerateSquaresWithYield(int count)
    {
        for (int i = 1; i <= count; i++)
        {
            yield return i * i;
        }
    }
}

在此示例中,该语句用于一次生成一个正方形。该方法的状态在调用之间保留,并且值是动态生成的。yield return优势yield return内存效率:使用允许我们创建迭代器,而无需一次生成整个序列并将其存储在内存中。值是动态生成的,从而减少内存消耗并提高性能,尤其是在处理大型数据集时。yield returnLazy Evaluation:此语句启用延迟计算,这意味着仅在需要时计算值。这在处理无限序列或生成计算成本高昂的值时特别有用。可读和可维护的代码:使用迭代器方法通常会产生更清晰、更具可读性的代码。生成序列的 logic 封装在方法中,使代码更易于理解。使用案例yield return无限序列一个有用的应用程序是生成无限序列。如果没有 ,创建无限序列将需要分配无限量的内存,这显然是不切实际的。使用 ,您可以动态生成值,而不会占用过多内存。yield returnyield returnusing System;

using System.Collections.Generic;
using System.Linq;
public class Program
{
    public static void Main()
    {
        // Infinite sequence
        var infiniteSequence = GenerateInfiniteSequence().Take(10);
        Console.WriteLine($"First 10 elements of infinite sequence: {string.Join(", ", infiniteSequence)}");
    }
    public static IEnumerable<int> GenerateInfiniteSequence()
    {
        int i = 1;
        while (true)
        {
            yield return i++;
        }
    }
}

在此代码中,将生成一个递增整数的无限序列,仅根据请求生成值。筛选和转换yield return当您需要筛选或转换序列中的元素时,也很有用。让我们考虑一个我们想要生成偶数平方的示例:

using System;
using System.Collections.Generic;
public class Program
{
    public static void Main()
    {
        // Filtering even squares
        foreach (var evenSquare in GenerateEvenSquares(5))
        {
            Console.WriteLine(evenSquare);
        }
    }
    public static IEnumerable<int> GenerateEvenSquares(int count)
    {
        for (int i = 1; i <= count; i++)
        {
            int square = i * i;
            if (square % 2 == 0)
            {
                yield return square;
            }
        }
    }
}

在此示例中,序列仅包含偶数的平方,并且该语句确保动态生成值。yield returnyield return是 C# 中的一项有价值的功能,它简化了迭代器的创建,提供了一种更高效、可读性更强的方法来生成值序列。通过使用 ,您可以编写更易于理解的节省内存的代码,使其成为 C# 工具包中有价值的工具。无论您是处理大型数据集、创建无限序列还是将过滤器应用于元素,都能提供灵活高效的解决方案。

文档更新时间: 2024-10-03 06:16   作者:admin