一。初始方法
static void FindOddNumbers()
{
var nums = Enumerable.Range(1, 10).ToList();
var result = new List();
foreach(var num in nums)
{
if (num % 2 != 0)
{
result.Add(num);
}
}
foreach(var num in result)
{
Console.WriteLine(num);
}
}
二。把筛选方法提取成单独的方法,功能独立
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EvolutionToLinq
{
class Program
{
static void Main(string[] args)
{
FindOddNumbers();
Console.ReadKey();
}
static bool IsOdd(int num)
{
return num % 2 != 0;
}
static void FindOddNumbers()
{
//原数据
var nums = Enumerable.Range(1, 10).ToList();
var result = new List();
//筛选数据
foreach(var num in nums)
{
if (IsOdd(num))
{
result.Add(num);
}
}
//输出结果
foreach(var num in result)
{
Console.WriteLine(num);
}
}
}
}
三。处理数据的方法提取。数据处理和显示分离
static bool IsOdd(int num)
{
return num % 2 != 0;
}
static void FindOddNumbers()
{
//原数据
var nums = Enumerable.Range(1, 10).ToList();
IEnumerable result = FilterIntegers(nums);
//输出结果
foreach (var num in result)
{
Console.WriteLine(num);
}
}
private static IEnumerable FilterIntegers(IEnumerable nums)
{
var result = new List();
//筛选数据
foreach (var num in nums)
{
if (IsOdd(num))
{
result.Add(num);
}
}
return result;
}
四/引入委托,允许外部修改筛选方法
public delegate bool PredicateDelegate(int value);//是一个类,应该写到类外面。里面也可以,但是外面好。
static bool IsEven(int num)
{
return num % 2 == 0;
}
static bool IsOdd(int num)
{
return num % 2 != 0;
}
static void FindOddNumbers()
{
//原数据
var nums = Enumerable.Range(1, 10).ToList();
IEnumerable result = FilterIntegers(nums,IsOdd);
//这里就可以随便用筛选方法了
//IEnumerable result = FilterIntegers(nums, IsEven);
//输出结果
foreach (var num in result)
{
Console.WriteLine(num);
}
}
private static IEnumerable FilterIntegers(IEnumerable nums,PredicateDelegate predicate)
{
var result = new List();
//筛选数据
foreach (var num in nums)
{
if (predicate(num))
{
result.Add(num);
}
}
return result;
}
五,引入泛型,这样筛选方法和具体的类型脱钩,可以使方法适应更多的情形。
public delegate bool PredicateDelegate(T value);
static bool IsEven(int num)
{
return num % 2 == 0;
}
static bool IsOdd(int num)
{
return num % 2 != 0;
}
static void FindOddNumbers()
{
//原数据
var nums = Enumerable.Range(1, 10).ToList();
IEnumerable result = Filter(nums,IsOdd);
//IEnumerable result = FilterIntegers(nums, IsEven);
//输出结果
foreach (var num in result)
{
Console.WriteLine(num);
}
}
private static IEnumerable Filter(IEnumerable nums,PredicateDelegate predicate)
{
var result = new List();
//筛选数据
foreach (var num in nums)
{
if (predicate(num))
{
result.Add(num);
}
}
return result;
}
六,用.net自带委托Func
//之前的delegate可以删除了。
private static IEnumerable Filter(IEnumerable nums,Func predicate)
{
var result = new List();
//筛选数据
foreach (var num in nums)
{
if (predicate(num))
{
result.Add(num);
}
}
return result;
}
七,用Lambda表达式替换方法参数
//isOdd。和IsEven可以删除了。
static void FindOddNumbers()
{
//原数据
var nums = Enumerable.Range(1, 10).ToList();
IEnumerable result = Filter(nums,num=>num%2!=0);
//IEnumerable result = FilterIntegers(nums, num=>num%2==0);
//输出结果
foreach (var num in result)
{
Console.WriteLine(num);
}
}
八,引入扩展方法,继续精简代码,把处理的数据功能增强,看起来像是数据本身的方法
现在的方法跟类型脱钩,并且适应面非常广。只要有IEnumberable接口都行。
static void FindOddNumbers()
{
//原数据
var nums = Enumerable.Range(1, 10).ToList();
IEnumerable result = nums.Filter(num => num % 2 != 0);
//IEnumerable result = FilterIntegers(nums, IsEven);
//输出结果
foreach (var num in result)
{
Console.WriteLine(num);
}
}
//原Filter方法删除
public static class MyExtensions
{
public static IEnumerable Filter(this IEnumerable list, Func predicate)
{
var result = new List();
//筛选数据
foreach (var num in list)
{
if (predicate(num))
{
result.Add(num);
}
}
return result;
}
}
九。用yield关键字节省内存的使用。不用出现List,大大节约内存。
public static class MyExtensions
{
public static IEnumerable Filter(this IEnumerable list, Func predicate)
{
//筛选数据
foreach (var num in list)
{
if (predicate(num))
{
yield return num;
}
}
}
}
十。把Filter换成Where。就是Linq的Where方法了~~~~
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。