你我之间,不需要时间在场。--zhu
一.为什么要学LINQ
LINQ能让数据处理变得简单。
例:统计一个字符串中每个字母出现的频率(忽略大小写),然后按照从高到低的顺序输出出现频率高于2次的单词和其出现频率。
var items = s.Where(c=>char.IsLetter(c))//过滤非字母
.Select(c=>char.ToLower(c))//大小字母转换为小写
.GroupBy(c=>c)//根据字母进行分组
.Where(g=>g.Count()>2)//过滤掉出现次数<=2
.OrderByDescending(g=>g.Count())//按次数排序
.Select(g=>new {Char=g.Key,Count=g.Count()});
推演
委托->lambda->LINQ
委托:
1.委托是可以指向方法的类型,是变量,调用委托变量时执行的就是变量指向的方法。
2..net中定义了泛型委托Action(无返回值)和Func(有返回值),所以一般不用自定义委托类型。
static void Main(string[] args)
{
D1 d= F1;
d();
d=F2;
d();
D2 d2 = Add;
Console.WriteLine(d2(3,5));
Action a=F1; //没返回值
a();
Func<int,int,int> f =Add; //有返回值
Console.WriteLine(f(3,5));
}
static void F1()
{
Console.WriteLine("我是F1");
}
static void F2()
{
Console.WriteLine("我是F2");
}
static int Add(int i1,int i2)
{
return i1+i2;
}
delete void D1();
delete void D2(int i,int j);
--运行结果:我是F1 我是F2
委托变量不仅可以指向普通方法,还可以指向匿名方法。
Func<int,int,string> f1=delegate(int i1,int i2){
return $"{i1}+{i2}={i1+i2}";
};
srting s=f1(1,2);
Action f2= delegate(){
Console.WriteLine("我是f2");
};
f2();
Action<string,int> f3= delegate(string n,string i){
Console.WriteLine($"n={n},i={i}");
};
f3("f3",18);
匿名方法可以写成lambad表达式,可以省略参数数据类型,因为编译能根据委托类型推断出参数的类型,用=>引出方法体。
Func<int,int,string> f1 = (i1,i2) =>{
return $"{i1}+{i2}={i1+i2}";
};
如果委托没有返回值,且方法体只有一行代码,可省略{}
Action<int,string> a1 = (age,name) => Console.WriteLine($"年龄{age},姓名{name}");
a1(18,"a1");
如果委托有返回值,且方法体只有一行代码,可省略{}以及return
Func<int,int,string> f1 = (i1,i2) => $"{i1}+{i2}={i1+i2}";
Console.WriteLine(f1(5,8));
如果委托只有一个参数,参数的()可以省略
Action<string> a1 = s => Console.WriteLine(s);
Func<int,bool> f2 = i => i>5;
回到LINQ
LINQ提供了很多集合的扩展方法(https://learn.microsoft.com/zh-cn/dotnet/csharp/programming-guide/classes-and-structs/extension-methods),配合lambad能够简化数据处理。
int[] nums =new int[] {3,99,88,77,5,2,66,7,54};
IEnumerable<int> items = nums.Where(i=>i>10);//using System.Linq;
foreach(int i in result)
{
Console.WriteLine(i);
}
注意:IEnumerable
自己写拓展方法MyWhere()
static IEnumerable<int> MyWhere1(IEnumerable<int> items,Func<int,bool> f)
{
list<int> result=new List<int>();
foreach(int i in items)
{
if(f(i)==true)
{
result.Add(i)
}
}
return result;
}
static IEnumerable<int> MyWhere2(IEnumerable<int> items,Func<int,bool> f)
{
foreach(int i in items)
{
if(f(i)==true)
{
yieid return i; //迭代器
}
}
return result;
}
--调用
static void Main(string[] args)
{
int[] nums=new int[] {3,4,45,7,2,9,35};
//IEnumerable<int> result=MyWhere1(nums,a=>a>10);
IEnumerable<int> result=MyWhere2(nums,a=>a>10);
foreach(int i in result)
{
Console.WriteLine(i);
}
}
关于yieldhttps://learn.microsoft.com/zh-cn/dotnet/csharp/language-reference/statements/yield
标签:Console,int,i2,LINQ,i1,result,WriteLine,准备 From: https://www.cnblogs.com/zhusichen/p/18283108