本帖最后由 飞/可爱朋 于 2018-2-10 11:59 编辑
概述:
C#中有一个关键字“Yield”,这个关键字提供了迭代功能,你是不是没用过这个关键字呢,下面讲述一下此关键字。
Yield:
在执行迭代时,程序将自动存储上次迭代的位置,下次迭代时从上次迭代的位置继续执行。
代码实例:
使用Yield实现的迭代方法:
[C#] 纯文本查看 复制代码 /// <summary>
/// 用Yield生成字符集合
/// </summary>
/// <param name="count">需要生成的字符个数</param>
/// <returns>生成的字符集合</returns>
private IEnumerable<string> CreateStrYield(int count)
{
//初始次数
int index = 0;
//循环产生字符
while (index++ < count)
{
//生成字符并中断迭代返回
yield return "Yield:" + index.ToString();
}
}
使用常见的For实现的迭代方法:
[C#] 纯文本查看 复制代码 /// <summary>
/// 用For生成字符集合
/// </summary>
/// <param name="count">需要生成的字符个数</param>
/// <returns>生成的字符集合</returns>
private List<string> CreateStrFor(int count)
{
//需要返回集合
List<string> rel = new List<string>();
//生成字符
for (int i = 0; i < count; i++)
{
rel.Add("For:" + (i + 1).ToString());
}
//返回结果
return rel;
}
最后我们来测试一下两种迭代产生的结果:
[C#] 纯文本查看 复制代码 //需要生成的字符个数
int countStr = 5;
//输出Yield生成的字符
foreach (var item in CreateStrYield(countStr))
{
Console.WriteLine(item);
}
//输出For生成的字符
foreach (var item in CreateStrFor(countStr))
{
Console.WriteLine(item);
}
观察输出结果
Yield:1
Yield:2
Yield:3
Yield:4
Yield:5
For:1
For:2
For:3
For:4
For:5
两者的迭代实现了相同的功能,Yield关键字记录了迭代的位置,保证下一次迭代时候能从上一次迭代完成的位置继续执行。
使用Yield的应用场景:
eg:游戏装备的升级成功率,在1~5次的升级成功率为80%,6~8的升级成功率为50%,9~10的升级成功率为20%,大于10的概率都为10%,参见如下代码
[C#] 纯文本查看 复制代码 /// <summary>
/// 用Yield生成概率
/// </summary>
/// <returns>生成的概率集合</returns>
private IEnumerable<float> CreateProb()
{
/*在1~5次的升级成功率为80%,6~8的升级成功率为50%,9~10的升级成功率为20% */
//初始次数
int index = 0;
//循环产生概率
while (index++ < 5)
{
//生成1~5概率
yield return 0.8f;
}
//循环产生概率
while (index++ < 9)
{
//生成6~8概率
yield return 0.5f;
}
//循环产生概率
while (index++ < 12)
{
//生成9~10概率
yield return 0.2f;
}
//大于10的概率都为10%
yield return 0.1f;
}
看一下输出结果:
[C#] 纯文本查看 复制代码 //输出概率
foreach (var item in CreateProb())
{
Console.WriteLine(item);
}
这是输出的结果
0.8
0.8
0.8
0.8
0.8
0.5
0.5
0.5
0.2
0.2
0.1
总结:如果你需要在一个完整的迭代中,不同的时候输出不同的且可控的结果,可以使用该关键字达到你的需求。
|