前言
每天学习一点点,别被大家落下太多就行Orz
今天读了《More Effective C#》,本篇博客是对第十七条——为序列创建可组合的API的练习。
注:
本篇均为对书的摘抄,全文无原创。
为啥CSDN的转载还得写一个link,我找不到书的link
使用迭代器创建可组合的API
使用场景:使用多个foreach时,可以考虑迭代器。
背景:对一个集合进行多次检查和修改,输出操作过的集合。
思路1:使用多个for进行遍历检查,但设计意味着每个操作都要重新遍历整个集合且影响程序效率。
思路2:在一个循环中完成所有操作,在一次迭代中生成最终结果。 好处:提高程序执行效率,降低程序内存占用。(因为不需要保存每个操作的中间步骤),但牺牲了可用性。
“C#迭代器可以让我们在操作序列的方法中根据调用者的需要一个一个地处理并返回元素。”
使用的就是yield return.
一、错误代码
//接收一个整形数组作为参数,并过滤掉重复元素,并输出;
//方法一,错误演示
public static void Unique(IEnumerable<int> nums)
{
Dictionary<int, int> uniqueVals = new Dictionary<int, int>();
foreach (int num in nums)
{
if (uniqueVals.ContainsKey(num))
{
uniqueVals.Add(num, num);
Console.WriteLine(num);
}
}
}
二、正确代码
1.接收一个整形数组作为参数,并过滤掉重复元素,并输出
代码如下(示例):
//function2
public static IEnumerable<int> Unique2(IEnumerable<int> nums)
{
Dictionary<int, int> uniqueVals = new Dictionary<int, int>();
foreach (int num in nums)
{
if (!uniqueVals.ContainsKey(num))
{
uniqueVals.Add(num, num);
yield return num;
}
}
}
//调用 function2
public static void Test2(IEnumerable<int> nums)
{
foreach (var num in Unique2(nums))
{
Console.WriteLine(num);
}
}
2.对滤掉重复元素后的数组平方,并输出
代码如下(示例):
//调用 function2
public static void Test2(IEnumerable<int> nums)
{
foreach (var num in Unique2(nums))
{
Console.WriteLine(num);
}
}
public static IEnumerable<int> Square(IEnumerable<int> nums)
{
foreach (int num in nums)
{
yield return num * num;
}
}
该处使用的url网络请求的数据。
三、调用和结果
结果:
总结
希望能继续学习