一.LinQ让数据处理变的简单,但是执行效率不一定最高, 本质就是委托
1.委托是可以指向方法的类型
2.Net中定义了泛型委托Action(无返回值)和Func(有返回值),所以一般不用自定义委托类型
3.c#中的var是强类型的
//委托举例
static void main(string[] args)
{
D1 d1=FSum;
Console.WriteLine(d1(1,2));
//Action使用举例:无参数
Action A1=F1;
A1();
//Action使用举例:传入两个参数,但是无返回值
Action A2=ADelegate;
A2();
//Func使用举例:2个参数,一个返回值参数
Func<int,int,int> f=FSum;
Console.WriteLine(f(5,2));
//Func使用举例:2个int参数,但是返回string类型
Func<int,int,string> fStr=FStr;
Console.WriteLine(fstr(1,2));
}
public static void F1()
{
Console.WriteLine("Hello World!");
}
public static int FSum(int a,int b)
{
return a-b;
}
public static string FStr(int a,int b)
{
int c=a+b;
return "返回字符串";
}
public static void ADelegate(int a,int b)
{
int c=a+b;
}
delegate int D1(int a,int b);
二:匿名委托的使用,这里主要是一步一步的从委托类型的写法,转换为Lamada表达式的写法
static void main(string[] args)
{
//匿名无参委托
Action a1=delegate(){
Console.WriteLine("我是aaa");
};
a1();
//有参匿名委托
Action<string,int> a2=delegate(string str,int i)
{
Console.WriteLine($"str={str},i={i}");
};
a2("Hello,Word!",0);
//有参数的匿名委托
Func<int,int,int> FReturn=delegate(int i,int j)
{
return i+j;
};
Console.WriteLine(FReturn(1,0));
//省略delegate的写法,变成了lamada表达式的写法
Func<int,int,int> Flamada=(int i,int j)=>{
return i+j;
};
Console.WriteLine(Flamada(0,1));
//去掉参数类型的写法
Func<int,int,int> FlamadaNoParameterType=(i,j)=>{
return i+j;
};
Console.writeLine(FlamadaNoParameterType(0,1));
//去掉大括号的,及return的写法,这种只适用于一行代码的写法
Action a1=()=>Console.WriteLine("我是aaa");
Console.WriteLine(a1);
Func<int,int,int> FlamadaNoParameterNoReturn=(i,j)=>i+j;
Console.WriteLine(FlamadaNoParameterNoReturn(0,1));
//终极演化版(只有一行代码且只有一个参数)
Action<int> ALast=t=>Console.WriteLine(t);
Func<int,bool> FLast=t=>t>0;
}
三 .解密Linq
static void Main(string[] args)
{
//使用系统where扩展方法获取数组中的大于3的集合
int[] nums=new int[] {1,2,3,4,5,6,7};
IEnumerable<int> Rel=nums.where(t=>t>3);
//使用自己写的demo获取集合
IEnumerable<int> MyWhereRel=WhereDemo(nums,t=>t>3);
//Yield方法,无需等待全部遍历完成,判断完成一个数据就输出一个数据
IEnumerable<int> MyWhereRel=WhereDemoYield(nums,t=>t>3);
foreach(int i in MyWhereRel)
{
Console.WriteLine(i);
}
}
static IEnumerable<int> WhereDemo(IEnumberable<int> items,Func<int,bool> f)
{
List<int> res=new List<int>();
foreach(int i in items)
{
if(f(i)==true)
{
res.Add(i);
}
}
return res;
}
static IEnumerable<int> WhereDemoYield(IEnumberable<int> items,Func<int,bool> f)
{
foreach(int i in items)
{
if(f(i)==true)
{
yield return i;
}
}
}