筛选出数组中值大于10的元素
普通方法实现
/// <summary>
/// 自定义筛选方法1
/// </summary>
/// <param name="items"></param>
/// <param name="func"></param>
/// <returns></returns>
static IEnumerable<int> MyWhere(IEnumerable<int> items, Func<int, bool> func)
{
List<int> result = new List<int>();
foreach (var item in items)
{
if (func(item))
{
result.Add(item);
}
}
return result;
}
/// <summary>
/// 自定义筛选方法2
/// </summary>
/// <param name="items"></param>
/// <param name="func"></param>
/// <returns></returns>
static IEnumerable<int> MyWhereYeild(IEnumerable<int> items, Func<int, bool> func)
{
foreach (var item in items)
{
if (func(item))
{
yield return item;
}
}
}
调用:
static void Main(string[] args)
{
int[] nums = new int[] { 1, 5, 9, 3, 52, 100 };
//方法一
var result1 = MyWhere(nums, a => a > 10);
foreach (var k in result1)
{
Console.WriteLine(k);
}
//方法二
var result2 = MyWhereYeild(nums, a => a > 10);
foreach (var k in result2)
{
Console.WriteLine(k);
}
Console.Read();
}
执行结果:
实现的原理是声明一个方法,参数分别是要筛选的数组和筛选条件。筛选条件是个委托,在调用的时候使用lambda表达式传入筛选条件。在方法体中判断,如果满足条件就将数据返回。
方法一和方法二的区别:
方法一会循环判断每一值,如果符合条件就将值存放在List中,数组中所有的值都遍历完成后,再将List返回;
方法二是在遍历时只要满足条件,立即将当前值返回到调用的地方,然后继续回到遍历当中,如果存在符合条件的值,再次将值返回到调用出,直到遍历结束。
Linq实现
static void Main(string[] args)
{
int[] nums = new int[] { 1, 5, 9, 3, 52, 100 };
var result = nums.Where(i => i > 10);//using System.Linq;
foreach (var k in result)
{
Console.WriteLine(k);
}
Console.Read();
}
执行结果:
引入Linq命名空间,调用数组的扩展方法,使用lambda表达式作为筛选条件。
Linq的where方法实现原理其实就是“自定义筛选方法1”的实现方式,只不过是框架做了封装,调用更加方便。