C#yield关键字详解
yield
是 C# 中的一个关键字,它可以用来创建迭代器。一个包括 yield
语句的方法或者运算符,被称之为迭代器方法或者迭代器块。
在一个迭代器方法中,通过 yield return
语句向调用者返回一个序列中的下一个元素。每次调用 iterator 方法时,通过 yield return
返回的元素会被记录下来,并暂停方法的执行,直到调用者请求下一个元素。
当所有元素都通过迭代器方法返回后,迭代器方法就会自动结束。
下面是迭代器方法的一般格式:
[public | private | protected | internal] yield [return] [类型] 名称([参数列表])
{
// 方法的具体实现
}
使用示例一
假设现在有一个需求,输入数组,输出数组的所有排列组合。
public static IEnumerable<int[]> Permutations(int[] arr)
{
if (arr == null) yield break;
int n = arr.Length;
if (n == 0) yield break;
if (n == 1)
{
yield return new int[] { arr[0] };
yield break;
}
for (int i = 0; i < n; i++)
{
int[] subArr = SubsetWithoutElementAtIndex(arr, i);
foreach (int[] perm in Permutations(subArr))
{
int[] result = new int[n];
result[0] = arr[i];
Array.Copy(perm, 0, result, 1, n - 1);
yield return result;
}
}
}
这个方法是一个迭代器方法,它根据输入数组 arr
,输出一个包含 arr
中所有元素的排列组合。
在方法的实现中,通过 yield return
语句来返回每一个结果。当调用者请求下一个元素时,该方法会继续计算出下一个结果,并通过 yield return
将结果返回。
使用示例二
假设现在有一个需求,将一个字符串列表按指定规则排序。
public static IEnumerable<string> OrderByRule(List<string> list)
{
if (list == null) yield break;
foreach (string str in list)
{
if (str != null && str.StartsWith("A"))
{
yield return str;
}
}
foreach (string str in list)
{
if (str != null && !str.StartsWith("A"))
{
yield return str;
}
}
}
这个方法也是一个迭代器方法,它根据输入列表 list
,返回经过指定规则排序后的字符串列表。
在方法的实现中,同样是通过 yield return
语句来返回每一个结果。这里我们通过两个 foreach
循环来实现排序,第一个循环筛选出以 "A" 开头的字符串,第二个循环筛选出不以 "A" 开头的字符串。这样来实现排序的效果。
结语
yield
关键字在 C# 中是一个非常有用的工具,它使得编写迭代器方法变得非常简单易懂。希望通过本文的介绍,能够帮助大家更好地理解和掌握 yield
关键字的使用。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C# yield关键字详解 - Python技术站