C# “yield return” 简化迭代并提高代码质量
C# 提供了各种功能,使编码更加高效和可读。其中一个功能是 statement,它在简化迭代器的创建方面起着至关重要的作用。yield return
什么?yield returnyield return是在 C# 中的迭代器方法上下文中使用的关键字组合。迭代器是一种通常返回 or 的方法,它懒惰地生成一系列值,根据请求一次生成一个元素。这在处理大型数据集或想要动态生成值时特别有用。IEnumerableIEnumerable
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# 工具包中有价值的工具。无论您是处理大型数据集、创建无限序列还是将过滤器应用于元素,都能提供灵活高效的解决方案。