.NET框架-LINQ 9类操作符使用举例
Linq标准查询操作符
语言集查询 Ganmge hteg.ratedQuw,LINQ,集 成了C#编程语言中的查询语法 ,可 以用相同的语法访问不同的数据源。 LINQ提 供了不同数据源的抽象层 ,所 以可以使用相同的语法。
1筛选操作符
筛选操作符定义了返回元素的条件。
筛选操作符 | 描述 |
---|---|
where | 使用谓词,返回布尔值 |
OfType< TResult> | 根据类型筛选元素 |
应用举例:
where用法:
var racers = from r in Formulal.Racerswhere r.Wins > 15 && r.Country == "Brazil" select r;
OfType< T>用法:
object[] data = {"one", 2, "three", 4, 5, "six"};var rtnData = data.OfType<string>(); //返回类型为string的数据元素集合
2投射操作符
把对象转化为另一个类型的新对象
投射操作符 | 描述 |
---|---|
select | |
selectMany |
用法举例:
select用法
var racers = from r in Formulal.Racerswhere r.Wins > 15 && r.Country == "Brazil"select new{Name = string.Format("{0} {1}", r.FirstName, r.LastName),Country = r.Country,Wins = r.Wins}; //输出为含有Name,Country,Wins共计3个属性的对象集合
selectMany用法
var ferrariDrivers = Formulal.Racers.SelectMany(r => r.Cars,(r, c) => new { Racer = r, Car = c }).Where(r => r.Car == "Ferrari").OrderBy(r => r.Racer.LastName).Select(r => r.Racer.FirstName + " " + r.Racer.LastName);//筛选出驾驶法拉利的选手集合
3排序操作符
改变返回元素的顺序
排序操作符 | 描述 |
---|---|
OrderBy | 升序排序 |
OrderByDescending | 降序排序 |
ThenBy | 第一次排序结果类似,用第二次升序排序 |
ThenByDescending | 第一次排序结果类似,用第二次降序排序 |
Reverse | 反转集合中元素的顺序 |
举例:
var racers = from r in Formulal.Racerswhere r.Country == "Brazil"orderby r.Wins descendingselect new{Name = string.Format("{0} {1}", r.FirstName, r.LastName),Country = r.Country,Wins = r.Wins};//国家为巴西,按照胜场次数降序排列
4连接运算符
用于合并不直接相关的集合
连接运算符 | 描述 |
---|---|
Join | 可以根据键选择器函数连接连接2个集合 |
GroupJoin | 连接两个集合,组合其结果 |
//Join连接//获取冠军年份在2003年后的选手var racer5 = from r in Formulal.Racersfrom y in r.Yearswhere y > 2003select new{Year = y,Name = string.Format("{0} {1}", r.FirstName, r.LastName)};//获取冠军年份在2003年后的团队var team1 = from r in Formulal.ChampionTeamsfrom y in r.Yearswhere y > 2003select new{Year = y,Name = string.Format("{0}", r.Name)};//连接var racerAndTeams = from r in racer5join t in team1 on r.Year equals t.Yearselect new{Yearj= r.Year,Racerj = r.Name,Teamj = t.Name};
结果:
Yearj | Racerj | Teamj |
---|---|---|
Yearj=2004 | Racerj=Michael Schumacher | Teamj =Ferrari |
Yearj=2005 | Racerj=Fernando Alonso | Teamj =Renault |
Yearj=2006 | Racerj=Fernando Alonso | Teamj =Renault |
Yearj=2007 | Racerj=Kimi Räikkönen | Teamj =Ferrari |
Yearj=2008 | Racerj=Lewis Hamilton | Teamj =Ferrari |
Yearj=2014 | Racerj=Lewis Hamilton | Teamj =Mercedes |
Yearj=2015 | Racerj=Lewis Hamilton | Teamj =Mercedes |
Yearj=2009 | Racerj=Jenson Button | Teamj =Brawn GP |
Yearj=2010 | Racerj=Sebastian Vettel | Teamj =Red Bull Racing |
Yearj=2011 | Racerj=Sebastian Vettel | Teamj =Red Bull Racing |
Yearj=2012 | Racerj=Sebastian Vettel | Teamj =Red Bull Racing |
Yearj=2013 | Racerj=Sebastian Vettel | Teamj =Red Bull Racing |
5组合运算符
把数据放在组中
组合运算符 | 描述 |
---|---|
GroupBy | 组合有公共键的元素 |
ToLookUp | 通过创建一个一对多的字典,来组合元素。 |
GroupBy用法举例:
var countries = from r in Formulal.Racersgroup r by r.Country into gorderby g.Count() descending, g.Keywhere g.Count() > 2select new { Country = g.Key, Count = g.Count() };//获取冠军次数大于2的国家
结果:
Country | Count |
---|---|
UK | 10 |
Brazil | 3 |
Finland | 3 |
如果分组需要根据多个字段,则应该这样写:
//按组合键分组后,每组元素个数大于2的分组,按降序排序var rtnByVal1 = from item in dataSourcegroup item by new { item.Val1, item.Val2 }into gwhere g.Count()>1orderby g.Count() descendingselect g;//按Val1和Val2组合为字典键,元素个数为值var dict = rtnByVal1.ToDictionary(g=>g.First(),g=>g.Count());
6量词操作符
如果元素序列满足指定的条件 ,量词操作符就返回布尔值
组合运算符 | 描述 |
---|---|
Any | 确定集合中是否有满足谓词函数的元素 |
All | 确定集合中是否都满足谓词函数的元素 |
Contains | 检查某个元素是否存在集合中 |
List<int> intList1 = new List<int>(5) {1, 2, 3, 4, 5}; bool any3 = intList1.Any(r => r == 3);//确定集合中是否有3,返回truebool any0 = intList1.Any(r => r == 0);//确定集合中是否有0,返回falsebool allMoreZero = intList1.All(r => r > 0);//确定序列中所有元素都满足大于0,返回truebool allMore2 = intList1.All(r => r > 2); //返回falsebool contains3 = intList1.Contains(3); //元素3是否在集合中,true
7分区操作符
分区操作符,返回一个子集。使用它们可以得到部分结果。
分区运算符 | 描述 |
---|---|
Take | 必须制定提取元素的个数 |
Skip | 跳过指定的元素个数,提取其他元素 |
TakeWhile | 提取条件为真的元素 |
SkipWhile | 跳过条件为真的元素 |
int pageSize = 5;int numberPages = (int)Math.Ceiling(Formulal.Racers.Count() / (double)pageSize);for (int page = 0; page < numberPages; page++){var racersPartition =(from r in Formulal.Racersorderby r.LastName, r.FirstNameselect r.FirstName + " " + r.LastName).Skip(page * pageSize).Take(pageSize); }
结果:
Page 0
Fernando Alons
Mario Andretti
Alberto Ascari
Jack Brabham
Jenson Button
Page 1
Jim Clark
Juan Manuel Fa
Nino Farina
Emerson Fittipaldi
Mika Hakkinen
Page 2
Lewis Hamilton
Mike Hawthorn
Damon Hill
Graham Hill
Phil Hill
8集合操作符(Set operators)
集合操作符返回 一 个集合。除了Distinct之外,其他都需要2个集合。
集合操作符 | 描述 |
---|---|
Distinct | 从集合中删除重复的元素 |
Union | 返回出现在其中一个集合中的唯一元素 |
Intersect | 交集 |
Except | 只出现在一个集合中的元素 |
Zip | 通过使用指定的谓词函数合并2个集合 |
应用举例:
List<int> intList1 = new List<int>(5) {1, 2, 3, 4, 5,3};List<int> intList2 = new List<int>(3) {2, 5, 0};var delDuplic = intList1.Distinct(); //去重,结果{1,2,3,4,5}var unionList = intList1.Union(intList2); //并集,结果{1,2,3,4,5,0}var interList = intList1.Intersect(intList2); //交集,结果{2,5}var exceptList = intList1.Except(intList2);//差集,结果{1,3,4}var exceptList2 = intList2.Except(intList1);//差集,结果{0}var unionList2 = intList1.Zip(intList2,((i1, i2) => i1+", "+i2)); 结果:{{1,2}{2,5}{3,0}}
9元素操作符(Element operators)
这些元素操作符仅返回一 个元素。
元素操作符 | 描述 |
---|---|
First | 返回第一个满足条件的元素 |
FirstOrDefault | 返回第一个满足条件的元素,但如果没有找到满足条件的元素,就返回类型的默认值 |
Last | 返回最后一个满足条件的元素 |
LastOrDefault | 返回最后一个满足条件的元素,但如果没有找到满足条件的元素,就返回类型的默认值 |
ElementAt | 指定了要返回的元素的位置 |
ElementAtOrDefault | 指定了要返回的元素的位置,但如果没有找到满足条件的元素,就返回类型的默认值 |
Single | 只返回一个满足条件的元素,如果有多个满足条件,就抛出一个异常。 |
SingleOrDefault | 只返回一个满足条件的元素,但如果没有找到满足条件的元素,就返回类型的默认值 |
应用举例:
List<int> intList1 = new List<int>(5) { 1, 8, 3, 4, 5, 3 };
int firstMore1 = intList1.First(r => r > 1);//结果:8
int firstMore17 = intList1.FirstOrDefault(r => r > 17); //结果:0(因为不存在)
int lastMore3 = intList1.Last(r => r > 3); //结果5
int last = intList1.ElementAt(2); //结果3,(索引从0开始)
10聚合操作符(Aggregate operators)
聚合操作符计算集合的一个值。利用这些聚合操作符 ,可 以计算所有值的总和、所有元
素的个数、值最大和最小的元素 ,以 及平均值等
聚合操作符 | 描述 |
---|---|
Count | 所有值的个数 |
Sum | 所有值的综合 |
Min | 所有值的的最小值 |
Max | 所有值的的最大值 |
Average | 所有值的平均数 |
public class MyIntClass{public string Name { get; set; }public int Integar { get; set; }public MyIntClass(string name, int i){this.Name = name;this.Integar = Integar;}}List<MyIntClass> intList1 = new List<MyIntClass>(5) { new MyIntClass("first",1),new MyIntClass("second",8) ,new MyIntClass("third",3) ,new MyIntClass("fourth",4) ,new MyIntClass("fifth",5) ,new MyIntClass("sixth",3) };int count = intList1.Count;int sum = intList1.Sum(r=>r.Integar);int min = intList1.Min(r => r.Integar);int max = intList1.Max(r => r.Integar);double average = intList1.Average(r => r.Integar);
11转换操作符(Conversion operators)
转换操作符将集合转换为数组 :IEnumberable、 IList, IDictionary 等。
Conversion operators | 描述 |
---|---|
ToArray | 集合转化为Array |
AsEnumerable | 返回类型为IEnumerable< T> |
ToList | 集合转化为List |
ToDictionary | 集合转化为Dictionary |
Cast< TResult> | 映射 |
还是上面的例子
IEnumerable<MyIntClass> ienuList = from r in intList1 where r.Integar > 3 select r; //返回默认的IEnumerable集合List<MyIntClass> ienuList2 = (from r in intList1 where r.Integar > 3 select r).ToList(); //返回ListMyIntClass[] ienuList2 = (from r in intList1 where r.Integar > 3 select r).ToArray();//返回数组var dict = (from r in intList1 where r.Integar > 3 select r).ToDictionary(r=>r.Name,r=>r.Integar); //字典,key是name, value:IntegarIEnumerable<MyIntClass> ienuList2 = (from r in intList1 where r.Integar > 3 select r).AsEnumerable();
12生成操作符(Generation operators)
这些生成操作符返回 一 个新集合
Generation operators | 描述 |
---|---|
Empty | 集合是空的 |
Range | 返回一系列数字 |
Repeat | 返回始终重复一个值的集合 |
IEnumerable<int> ints = Enumerable.Range(3, 10);//{3,4,5,6,7,8,9,10,11,12}
IEnumerable<int> emptyInts = Enumerable.Empty<int>();//生成一个空集合
IEnumerable<int> ints2= Enumerable.Repeat(6,8);//生成8个6的集合
附:展示所用到的实体类和数据
选手实体类
//选手实体类public class Racer {public Racer(string firstName = null, string lastName = null, string country = null, int starts = 0,int wins = 0, IEnumerable<int> years = null, IEnumerable<string> cars = null){this.FirstName = firstName;this.LastName = lastName;this.Country = country;this.Starts = starts;this.Wins = wins;var yearList = new List<int>();if (years != null){foreach (var year in years){yearList.Add(year);}this.Years = yearList.ToArray();}if (cars != null){var carList = new List<string>();foreach (var car in cars){carList.Add(car);}this.Cars = carList.ToArray();}public string FirstName { get; set; }public string LastName { get; set; }//赢得比赛的次数public int Wins { get; set; }//所属国家public string Country { get; set; }//开始做的年龄public int Starts { get; set; }//车型数组public string[] Cars { get; private set; }//赢得冠军的年份public int[] Years { get; private set; } }}
选手数据
//选手Listpublic static List<Racer> Racers = new List<Racer>(40){ new Racer("Nino", "Farina", "Italy", 33, 5, new int[] { 1950 }, new string[] { "Alfa Romeo" }),new Racer("Alberto", "Ascari", "Italy", 32, 10, new int[] { 1952, 1953 }, new string[] { "Ferrari" }),new Racer("Juan Manuel", "Fangio", "Argentina", 51, 24, new int[] { 1951, 1954, 1955, 1956, 1957 }, new string[] { "Alfa Romeo", "Maserati", "Mercedes", "Ferrari" }),new Racer("Mike", "Hawthorn", "UK", 45, 3, new int[] { 1958 }, new string[] { "Ferrari" }),new Racer("Phil", "Hill", "USA", 48, 3, new int[] { 1961 }, new string[] { "Ferrari" }),new Racer("John", "Surtees", "UK", 111, 6, new int[] { 1964 }, new string[] { "Ferrari" }),new Racer("Jim", "Clark", "UK", 72, 25, new int[] { 1963, 1965 }, new string[] { "Lotus" }),new Racer("Jack", "Brabham", "Australia", 125, 14, new int[] { 1959, 1960, 1966 }, new string[] { "Cooper", "Brabham" }),new Racer("Denny", "Hulme", "New Zealand", 112, 8, new int[] { 1967 }, new string[] { "Brabham" }),new Racer("Graham", "Hill", "UK", 176, 14, new int[] { 1962, 1968 }, new string[] { "BRM", "Lotus" }),new Racer("Jochen", "Rindt", "Austria", 60, 6, new int[] { 1970 }, new string[] { "Lotus" }),new Racer("Jackie", "Stewart", "UK", 99, 27, new int[] { 1969, 1971, 1973 }, new string[] { "Matra", "Tyrrell" }),new Racer("Emerson", "Fittipaldi", "Brazil", 143, 14, new int[] { 1972, 1974 }, new string[] { "Lotus", "McLaren" }),new Racer("James", "Hunt", "UK", 91, 10, new int[] { 1976 }, new string[] { "McLaren" }),new Racer("Mario", "Andretti", "USA", 128, 12, new int[] { 1978 }, new string[] { "Lotus" }),new Racer("Jody", "Scheckter", "South Africa", 112, 10, new int[] { 1979 }, new string[] { "Ferrari" }),new Racer("Alan", "Jones", "Australia", 115, 12, new int[] { 1980 }, new string[] { "Williams" }),new Racer("Keke", "Rosberg", "Finland", 114, 5, new int[] { 1982 }, new string[] { "Williams" }),new Racer("Niki", "Lauda", "Austria", 173, 25, new int[] { 1975, 1977, 1984 }, new string[] { "Ferrari", "McLaren" }),new Racer("Nelson", "Piquet", "Brazil", 204, 23, new int[] { 1981, 1983, 1987 }, new string[] { "Brabham", "Williams" }),new Racer("Ayrton", "Senna", "Brazil", 161, 41, new int[] { 1988, 1990, 1991 }, new string[] { "McLaren" }),new Racer("Nigel", "Mansell", "UK", 187, 31, new int[] { 1992 }, new string[] { "Williams" }),new Racer("Alain", "Prost", "France", 197, 51, new int[] { 1985, 1986, 1989, 1993 }, new string[] { "McLaren", "Williams" }),new Racer("Damon", "Hill", "UK", 114, 22, new int[] { 1996 }, new string[] { "Williams" }),new Racer("Jacques", "Villeneuve", "Canada", 165, 11, new int[] { 1997 }, new string[] { "Williams" }),new Racer("Mika", "Hakkinen", "Finland", 160, 20, new int[] { 1998, 1999 }, new string[] { "McLaren" }),new Racer("Michael", "Schumacher", "Germany", 287, 91, new int[] { 1994, 1995, 2000, 2001, 2002, 2003, 2004 }, new string[] { "Benetton", "Ferrari" }),new Racer("Fernando", "Alonso", "Spain", 252, 32, new int[] { 2005, 2006 }, new string[] { "Renault" }),new Racer("Kimi", "Räikkönen", "Finland", 230, 20, new int[] { 2007 }, new string[] { "Ferrari" }),new Racer("Lewis", "Hamilton", "UK", 166, 43, new int[] { 2008, 2014, 2015 }, new string[] { "McLaren", "Mercedes" }),new Racer("Jenson", "Button", "UK", 283, 15, new int[] { 2009 }, new string[] { "Brawn GP" }),new Racer("Sebastian", "Vettel", "Germany", 156, 42, new int[] { 2010, 2011, 2012, 2013 }, new string[] { "Red Bull Racing" })};
团队实体类
[Serializable]public class Team{public Team(string name, params int[] years){this.Name = name;this.Years = years;}public string Name { get; private set; }public int[] Years { get; private set; }}
团队数据
//冠军团队Listpublic static List<Team> ChampionTeams = new List<Team>(){new Team("Vanwall", 1958),new Team("Cooper", 1959, 1960),new Team("Ferrari", 1961, 1964, 1975, 1976, 1977, 1979, 1982, 1983, 1999, 2000, 2001, 2002, 2003, 2004, 2007,2008),new Team("BRM", 1962),new Team("Lotus", 1963, 1965, 1968, 1970, 1972, 1973, 1978),new Team("Brabham", 1966, 1967),new Team("Matra", 1969),new Team("Tyrrell", 1971),new Team("McLaren", 1974, 1984, 1985, 1988, 1989, 1990, 1991, 1998),new Team("Williams", 1980, 1981, 1986, 1987, 1992, 1993, 1994, 1996, 1997),new Team("Benetton", 1995),new Team("Renault", 2005, 2006),new Team("Brawn GP", 2009),new Team("Red Bull Racing", 2010, 2011, 2012, 2013),new Team("Mercedes", 2014, 2015)};
.NET框架-LINQ 9类操作符使用举例相关推荐
- LINQ标准查询操作符
本文基于.NET Framework 2.0编写 本文PDF下载 推荐大家下载本文的PDF进行阅读,可以方便的使用书签来阅读各个方法,而且代码中的关键字是高亮显示的. 转载请注明出处. 一.投影操作符 ...
- ABP +VUE Elment 通用高级查询(右键菜单)设计+LINQ通用类Expression<Func<TFields, bool>>方法
ABP +VUE Elment 通用高级查询(右键菜单)设计+LINQ通用类Expression 1. 目前需要用VUE实现源cs系统报表的右键菜单所有和自定义查询功能. 1.1 CS端的右键菜单效果 ...
- SpringSecurity权限管理框架系列(六)-Spring Security框架自定义配置类详解(二)之authorizeRequests配置详解
1.预置演示环境 这个演示环境继续沿用 SpringSecurit权限管理框架系列(五)-Spring Security框架自定义配置类详解(一)之formLogin配置详解的环境. 2.自定义配置类 ...
- 【Android 插件化】Hook 插件化框架 ( 反射工具类 | 反射常用操作整理 )
Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...
- tp5类的属性不存在_thinkPHP5.1框架中Request类四种调用方式示例
本文实例讲述了thinkPHP5.1框架中Request类四种调用方式.分享给大家供大家参考,具体如下: 1. 传统调用 访问方式:http://127.0.0.1/demo/demo3/test?n ...
- 自定义MVC框架之工具类-图像处理类
截止目前已经改造了4个类: ubuntu:通过封装验证码类库一步步安装php的gd扩展 自定义MVC框架之工具类-分页类的封装 自定义MVC框架之工具类-文件上传类 图像处理类: 1,图片加水印处理( ...
- Mermaid classDiagram类图应用举例 汉,蜀汉,刘宋关系图
Mermaid classDiagram类图应用举例 汉,蜀汉,刘宋关系图 西汉.东汉.蜀汉.刘宋 源代码如下,效果图在后 classDiagramclass 刘邦{ <<-201--19 ...
- 初识RxJava(三)转换类 操作符
前言: 昨天的两篇介绍了 RxJava 的创建类操作符和延时类操作符,今天笔者记录一下 转换类 操作符,不太监了 ,开始记笔记.对了具体不太清楚转换过程的 可以去拜读 这位大佬 Season_zlc ...
- php接入微信支付,扫码支付和H5支付(非微信浏览器),基于thinkPHP框架 WeChatDeveloper支付类包 踩坑指南
此文章入选<PHP领域内容榜>第4名 文章介绍 本文主要介绍通过thinkPHP5和第三方支付类包(WeChatDeveloper)实现快速接入微信扫码支付和微信H5手机网站支付(非微信浏 ...
最新文章
- HiCar SDK概述
- 自动清理归档日志_从MYSQL 数据库归档 到 归档设计
- sigmoid函数手动求导
- Ubuntu 16.04 安裝chrome
- php旧物交易开源代码_PHP学习笔记:php二手交易市场系统
- bootice添加黑苹果引导_懒人黑苹果安装教程:CLOVER(四叶草)引导
- Win10取消开机密码
- CCF_Java_201909-3_字符画
- 专科咋了?5年时间从三流外包到阿里P6,逆袭成功终于肝出了这份大厂Android研发岗中高级面经!
- C语言中创建自己函数库文件流程
- 【Week2 -3】Switch日程安排
- 想知道黑白照片怎么变彩色?这些软件你值得拥有
- 西南政法大学计算机课程要求,西南政法大学本科课程教学改革办法
- 工厂设备管理中经常会遇到哪些问题?
- cloudera时钟同步
- 智能ERP 交接班统计异常的解决方法
- 拳头账号注册服务器异常,拳头账号注册登录不了解决方法
- 2021长三角智能包装产业发展大会
- 帮忙设计一个数字电子时钟的课程设计
- Fluent燃料电池系统CFD仿真模型,单通道的单电池模型,包含冷却水道的
热门文章
- 【Java】两层for循环 break跳出
- 挖掘城市ip_大咖齐聚泉州 为城市IP发声
- html如何制作一个手机商城网页通栏
- egg-jwt egg jwt 使用
- AutoJs学习-录屏功能
- gta5 android版数据包,apk.gta5com数据包
- 全新英特尔®凌动™处理器E3900系列:支持下一代智能互联的物联网设备 —— 这个全新处理器系列把计算能力迁移到更靠近传感器的位置,从而减轻把所有处理工作推向数据中心的需求...
- GTA5内置html菜单源码,GTA5免费内置菜单辅助
- 全球最快12Mbps超高速蓝牙,OPPO发布第二款自研芯片马里亚纳Y
- 台式电脑显示无法自动修复此计算机,windows无法自动修复此计算机怎么解决