为什么要使用LINQ? LINQ能让数据处理变得更简单
LINQ写出来的代码效率不一定是最高的。但是在性能可以忍受的情况下,用linq绝对是简单高效的
委托--> lambda-->linq
委托
什么叫委托
//指向方法的数据类型
class Program
{
static void Main(string[] args)
{
D1 d1 = F1; //不是D1 d1 = F1();不要加括号,加了就是调用F1这个方法了
d1();
d1 = F2;
d1(3,5);
}
static void F1()
{
console.write("我是F1");
}
static void F2(int i ,int j)
{
console.write("我是F2");
console.write(i+j);
}
}
delegate void D1();
//执行结果
我是F1
我是F28
定义委托/自定义委托
.net中定义了两个泛型委托,Action(无返回值)和Func(有返回值),所以一般不用自定义委托
//所以上面代码可以替代成
class Program
{
static void Main(string[] args)
{
Action action = F1;
action();
Func<int i,int j> func = F2;
func(3,5);
}
static void F1()
{
console.write("我是F1")
}
static void F2(int i ,int j)
{
console.write(i+j);
}
}
委托还可以指向匿名的方法
Action<int i,int j> action = delegate(int 1,int j){console.write("你好")}
Lambda
省略方法名,(){}中间加 gsto--=>,就是lambda,参数的数据类型也可以省掉,因为编译器能够根据委托类型推断出参数的数据类型:
Action<> action = delegate(int i,int j){console.write("你好")}
Action<> action = (int i,int j)=>{console.write("你好")}
Action<> action = (i, j)=>{console.write("你好")}
还有一种能够将{}也省略的情况:没有返回值,并且只有一行执行代码
Action<> action = (i, j)=>console.write("你好")
甚至有返回值,并且语句只有一个,{}也可以直接省略掉
Action<> action = (i, j)=> i+j
更甚至如果参数只有一个,那么参数的()也可以省掉
Action<> action = i => i+5
下面开始正式学习LINQ的方法
LINQ一个很神奇的地方就是为我们集合的拓展提供了很多的方法,这些拓展的方法能够极大的简化数据处理。比如说我们这里有一个数组,我要获取其中大于10的那个数,大家想想可以怎么实现
首先想到的是可以使用for循环,然后挨个遍历,对不对;其实可以使用LINQ
实现代码如下:
int[] arry = new int[]{3,11,5,99,33,42,15,7,55};
IEnumerable<int> items = arry.where(i=>i>10); //注意arry.不会提示where ,因为不是arry自带的,是一个扩展方法,所以需要引用System.linq
不用linq,自己手写一个where方法
static IEnumerable<int> where(IEnumerable<int> items,Func(int i,bool b) f1)
{
int[] arry = new int[]{};
foreach(int i in items)
{
if(f1(i))
{
arry.ADD(i);
}
}
return arry;
}
//使用yield效率更高,上面是全部执行完成以后,将数据一起返回,yield则是一边处理一边返回,效率更高
static IEnumerable<int> where(IEnumerable<int> items,Func(int i,bool b) f1)
{
int[] arry = new int[]{};
foreach(int i in items)
{
if(f1(i))
{
yield return i;
}
}
}
linq的一些方法:
数组、list、字典、set...他们都是实现了IEnumerable接口的,因此可以使用 IEnumerable的扩展方法,比如.where、.count()、.Any()【是否至少有一条数据满足条件】
.where
.count()
.Any() 是否至少有一条数据满足条件
Single() 有且只有一条满足要求
SingleOrDefault() 最多只有一条满足要求
First() 至少有一条,返回第一条
FirstOrDefault() 返回第一条或者默认值
还有聚合函数:Max()、Min() Average() Sum() Count()
GroupBy()
投影
思维导图: