public class Person { public string Name { get; set; } public string Sex { get; set; } public int Age { get; set; } }List list = new List() { new Person(){ Name="Olive",Sex="女",Age=22}, new Person(){ Name="Moyao",Sex="男",Age=23}, new Person(){ Name="Momo",Sex="女",Age=22}, new Person(){ Name="Only",Sex="女",Age=20}, new Person(){ Name="Love",Sex="女",Age=21}, new Person(){ Name="For",Sex="女",Age=22}, new Person(){ Name="Remote",Sex="男",Age=23}, new Person(){ Name="Snow",Sex="女",Age=23} };//从list集合中选出性别为"女"的人 var girls = from g in list where g.Sex == "女" select g; //从list集合中选出性别为"男"的人 var boys = list.Where(p => p.Sex == "男"); Console.WriteLine("girl" + System.Environment.NewLine); foreach (var g in girls) { Console.WriteLine("姓名:" + g.Name + "--性别:" + g.Sex + "--年龄:" + g.Age); Console.WriteLine(System.Environment.NewLine); } context.Response.Write("boy" + System.Environment.NewLine); foreach (var b in boys) { Console.WriteLine("姓名:" + b.Name + "--性别:" + b.Sex + "--年龄:" + b.Age); Console.WriteLine(System.Environment.NewLine); }输出结果如下:

细心的朋友们可能会发现从list集合中获取信息的方式不一样,在获取性别为"女"的集合中采用的是from g in list where g.Sex== "女" select g;
而在获取性别为"男"的集合中采用的为list.Where(p => p.Sex == "男");
或许会有人问,这两种查询方式有什么区别呢?上面的第一种方法叫查询语法(query syntax),看上去和SQL的语句很相似。查询语法使用查询表达式书写。第二种方法叫方法语法(method syntax)是命令形式,它使用的是标准的方法调用,方法是一组叫做标准查询运算符的方法。虽然形式上这两种查询方法不同,事实上这两种方法存在着紧密的联系,在CLR内只识别查询方法,因此在每次查询的时候编译器在编译时会将查询语句翻译为查询方法,当然大部分的查询方法也都有对应的查询语句形式,例如:where对应Where(),select对应Select(),orderby对应orderby(),group对应group(),join对应Join(),distinct对应Distinct(),union对应Union(),Intersect对应Intersect(),except对应Except(),等等。
我们看SQL查询形式:select查询内容 from数据源 where查询条件,也就是分为数据源、查询条件、查询内容这三部分,在LINQ查询里也是分这三部分,从上面的例子中我们可以知道它的查询方式是这样的from a(查询内容) in数据源 where查询条件 select a(查询内容)
下边就从最基本的介绍开始。
1、from
在SQL里边from后跟的是数据源,当然在LINQ里from子句指定的也是要作为数据源使用的数据集合,但是它引入了迭代变量,迭代变量有序表示数据源的每一个元素,最后查询返回的是一个迭代变变量的集合。
2、Where/where()
在SQL里where后跟的是查询条件,在LINQ里也是一样的。
请看示例:
//查询年龄大于21且性别为女的人员的个人信息var girls1 = from g in listwhere g.Age > 21 && g.Sex == "女"select g;//使用查询方法查询var girls1 = list.Where(g => g.Age > 21 && g.Sex == "女");Console.WriteLine("年龄大于21且性别为女的个人信息:");foreach (var g in girls1){ Console.WriteLine("姓名:" + g.Name + "--性别:" + g.Sex + "--年龄:" + g.Age);}实验结果:

从实验结果中我们可以看到,在查询语句中where后边也可以跟一个或多个查询条件,去筛选数据,以得到想要的结果,或许还有人对使用查询方法有点疑问,查询方法where()里边的参数到底是什么呢?这里就用到了上一节我们讲的Lambda表达式。
请看Where()的原型:
where()语法是:
public static IEnumerable where(this IEnumerable source,Func<TSource,bool> predicate)
由上一节学的知识我们可以知道该方法是一个泛型的扩展方法,该方法只接受一个Func<TSource,bool>泛型委托参数,这里的predicate是一个判断条件。
我们上边用的list.Where(g=>g.Age>21 && g.Sex) 高亮部分就相当于一个委托参数,所以用where()查询方法才能查出符合条件的信息。至于上边提到的Selec()、Orderby()等查询方法语法原型都是泛型的扩展方法和where()差不多,后边就不再过多的介绍其方法原型了。
3、select/select()
select筛选出符合条件的数据
用查询语句查询var g1=from g in list where g.Name="Olive" select g1;
用查询方法查询姓名为Olive的人员信息:
var g1 = list.Select(p=>p).Where(p=>p.Name == "Olive");
结果如下:
![]()
4、排序:orderby/OrderBy()、thenBy()、ThenByDescending()
//用orderby进行排序(默认升序)Var ps=from p in list select p orderby//用OrderBy()进行排序(升序)var g11 = list.OrderBy(p => p.Age);
结果如图:

//用orderby descending降序排列var ps=from p in list select p orderby p.Age descending//用OrderByDescending()降序排序var g11 = list.OrderByDescending(p => p.Age);
结果如图:

用ThenBy()做二次排序,先按年龄的升序排序,如果年龄相等的就再按姓名升序排序
var g12 = list.OrderBy(p => p.Age).ThenBy(p => p.Name);
结果如图:

//用group子句进行分组Var ps=from p in list group p.Sex into p select p;//使用GroupBy()进行分组var g11 = list.OrderByDescending(p => p.Age).GroupBy(p=>p.Sex);
用ThenByDescending()做二次排序,先按年龄的升序排序,如果年龄相等的就再按姓名降序排序
var g12 = list.OrderBy(p => p.Age).ThenByDescending(p => p.Name);
结果如图:

5、group/GroupBy()
使用group子句可产生按照指定的键组织的组序列。
//用group子句进行分组Var ps=from p in list group p.Sex into p select p;//使用GroupBy()进行分组var g11 = list.OrderByDescending(p => p.Age).GroupBy(p=>p.Sex);
结果如下:

6、Take、TakeWhile、Skip、SkipWhile
6.1、Take:用于从输入序列中返回指定数量的元素
//从满足条件的的序列中返回3条信息
var g12 = list.OrderBy(p => p.Age).ThenByDescending(p => p.Name).Take(3);

6.2、TakeWhile:只要满足一定条件的就会马上返回序列元素
var g12 = list.OrderBy(p => p.Age).ThenByDescending(p => p.Name).TakeWhile(p=>p.Sex=="女");
结果如图:
![]()
6.3 、Skip:用于从输入序列中跳过指定个数的元素,返回由序列中剩余的元素所组成的新序列
/跳过4个指定元素,然后将剩余的元素组成新序列返回var g12 = list.OrderBy(p => p.Age).ThenByDescending(p => p.Name).Skip(4);
6.4、SkipWhile:用于从输入序列中跳过满足一定条件指定数量的元素,返回由序列中剩余的元素所组成的新序列
//跳过姓名为"Olive"的信息,然后将剩余的的元素组成新的序列返回
var g12 = list.OrderBy(p => p.Age).ThenByDescending(p => p.Name).SkipWhile(p=>p.Name=="Olive");
结果如下:

7、Count(),Max()/Min(),Average(),Sum()聚合方法
7.1、Count():统计序列中元素个数
示例:
//求最大年龄:var g121 = list.OrderBy(p => p.Age).ThenByDescending(p => p.Name).Max(p => p.Age);Console.WriteLine("最大年龄为:"+g121);结果:
![]()
示例:
//求最小年龄:var g121 = list.OrderBy(p => p.Age).ThenByDescending(p => p.Name).Min(p => p.Age);Console.WriteLine("最小年龄为:"+g121);结果:
![]()
7.3、Average()求平均值
示例:
//求平均年龄:var g121 = list.OrderBy(p => p.Age).ThenByDescending(p => p.Name).Average(p => p.Age);Console.WriteLine("平均年龄为:"+g121);结果:
![]()
7.4、Sum()累加求和
示例:
//累加年龄:var g121 = list.OrderBy(p => p.Age).ThenByDescending(p => p.Name).Average(p => p.Age);Console.WriteLine("累加年龄为:"+g121);结果:![]()
8、Join(),GroupJoin(),Union(),Intersect(),Except(),Contact(),Distinct操作符
8.1、Join()用于连接两个序列,和SQL里的Join语句连接多表一样,连接操作接受两个集合然后创建一个临时的对象集合,每个对象包含原始集合对象中的所有字段,使用连接来结合两个或更多个集合中的数据。
例如:
//这里使用上边新建的Person类,然后在新建一个Profession(职业)类Public class Profession{ Public string Name{get;set:} Public string Zhiye{get;set;}}List<Person> list=new List<Person>(){ new Person(){ Name="Olive",Sex="女",Age=22}, new Person(){ Name="Moyao",Sex="男",Age=23}, new Person(){ Name="Momo",Sex="女",Age=22}, new Person(){ Name="Only",Sex="女",Age=20}, new Person(){ Name="Love",Sex="女",Age=21}, new Person(){ Name="For",Sex="女",Age=22}, new Person(){ Name="Remote",Sex="男",Age=23}, new Person(){ Name="Snow",Sex="女",Age=23}};List<Profession> listprofession = new List<Profession>{ new Pro......原文转载:http://www.shaoqun.com/a/868455.html
跨境电商:https://www.ikjzd.com/
promotion:https://www.ikjzd.com/w/127
pocket:https://www.ikjzd.com/w/1903
易趣:https://www.ikjzd.com/w/210
publicclassPerson{publicstringName{get;set;}publicstringSex{get;set;}publicintAge{get;set;}}Listlist=newList(){newPerson(){Name="Olive",Sex="女",Age=22},newPerson(){Name="Moyao
lithium:https://www.ikjzd.com/w/2505
昆明汉华天马山凌崖汤泉营业时间?开放时间:http://www.30bags.com/a/370272.html
昆明华怡温泉门票2021年1月价格:http://www.30bags.com/a/231058.html
昆明华怡温泉门票多少钱?团购票价优惠吗:http://www.30bags.com/a/231102.html
昆明华怡温泉营业时间?开放时间:http://www.30bags.com/a/231101.html
我想㖭你腿间的花 乖乖宝贝让我爽一下:http://lady.shaoqun.com/a/247516.html
一个添下面两个吃奶 跟两个男人同时做真爽:http://lady.shaoqun.com/m/a/247871.html
老头一边吃奶一边摸下面 被老头做的死去活来:http://lady.shaoqun.com/m/a/247872.html
品牌卖家狂喜:专属功能再添一项联系买家删差评!:https://www.ikjzd.com/articles/146549
深圳Annie百老汇音乐剧门票优惠入口:http://www.30bags.com/a/493652.html
深圳暑假活动汇总2021(持续更新):http://www.30bags.com/a/493653.html
公司产品需要海外推广怎么选择渠道:https://www.ikjzd.com/articles/146552
No comments:
Post a Comment