《C#高级编程》学习总结之LINQ
一、标准的查询操作符
| 标准查询操作符 | 说明 |
|
Where OfType<TResult> |
筛选操作符定义了返回元素的条件。 |
|
Select SelectMany |
投射操作符用于把对象转换为另一个类型的新对象。 |
|
OrderBy ThenBy OrderByDescending ThenByDescending Reverse |
排序操作符改变所返回的元素的顺序。OrderBy升序,OrderByDescending降序。如果第一次排序的结果很类型,可以使用ThenBy和ThenBy Descending操作符进行第二次排序,Reverse翻转集合中元素的顺序。 |
|
Join GroupJoin |
连接操作符用于合并不直接相关的集合。Join操作符根据键选择器关联两个集合。GroupJoin操作符连接两个集合,组合其结果。 |
|
GroupBy ToLookup |
组合操作符把数据分组。GroupBy操作符组合有公共键的元素。ToLookup通过创建一个一对多字典,来组合元素。 |
|
Any All Contains |
如果元素序列满足指定的条件,限定符操作符就返回布尔值。Any确定集合中是否有满足谓词函数的元素;All确定集合中的所有元素是否都满足谓词函数;Contains检查某个元素是否存在集合中。 |
|
Take Skip TakeWhile SkipWhile |
分区操作符返回集合的一个子集。使用Take必须指定要从集合中提取的元素个数;Skip跳过指定的元素个数;TakeWhile提取条件为真的元素;SkipWhile跳过条件为真的元素。 |
|
Distinct Union Intersect Except Zip |
Set操作符返回一个集合。Distinct从集合中删除重复的元素;Union返回出现在其中一个集合中的唯一元素;Intersect返回两个集合中都有的元素;Except返回只出现在一个集合中的元素;Zip把两个集合合并成一个。 |
|
First FirstOrDefault Last LastOrDefault ElementAt ElementAtOrDefault Single SingleOrDefault |
元素操作符仅返回一个元素。First返回第一个满足条件的元素;FirstOrDefault类似于First,但如果没找到满足条件的元素就返回默认值;Last返回最后一个满足条件的元素;ElementAt制定了要返回的元素的位置。Single只返回一个满足条件的元素,如果有多个元素满足条件,则抛出一个异常。 |
|
Count Sum Min Max Average Aggregate |
聚合操作符计算集合的一个值。 |
|
ToArray AsEnumerable ToList ToDictionary Cast<TResult> |
这些转换操作符将集合转换为数组。 |
|
Empty Range Repeat |
生成操作符返回一个新集合。使用Empty时集合是空的;Range返回一系列数字;Repeat返回一个始终重复一个值的集合。 |
- 筛选操作符Where
, , , , , , , , };
var query = from r in arr
select r;
foreach (var item in query)
{
Console.WriteLine(item);
}
Console.ReadLine();
- 使用索引筛选
//找出数组中大于5且索引不为偶数的元素
, , , , , , , , };
&& index % != );
foreach (var item in query)
{
Console.WriteLine(item);
}
Console.ReadLine();
- 类型筛选
//筛选集合中为string类型的元素
, , };
var query = obj.OfType<string>();
foreach (var item in query)
{
Console.WriteLine(item);
}
Console.ReadLine();
- 复合的from子句
如果需要根据对象的一个成员进行筛选,而该成员本身又是一个集合,就可以使用符合的from子句。
var ferrariDrivers = from r in Formula1.GetChampions()
from c in r.Cars
where c == "Ferrari"
orderby r.LastName
select r.FirstName + " " + r.LastName;
foreach (var item in ferrariDrivers)
{
Console.WriteLine(item);
}
Console.ReadLine();
- 排序
, , , , , , , , };
var query = (from r in myInt
orderby r descending
);
foreach (var item in query)
{
Console.WriteLine(item);
}
Console.ReadLine();
- 分组
var countries = from r in Formula1.GetChampions()
group r by r.Country into g
orderby g.Count() descending, g.Key
select new
{
COUNTRY = g.Key,
COUNT = g.Count()
};
foreach (var item in countries)
{
Console.WriteLine("{0} {1}", item.COUNTRY, item.COUNT);
}
Console.ReadLine();
- 对嵌套对象分组
var countries = from r in Formula1.GetChampions()
group r by r.Country into g
orderby g.Count() descending, g.Key
select new
{
Country = g.Key,
Count = g.Count(),
Racers = from r1 in g
orderby r1.LastName
select r1.FirstName + " " + r1.LastName
};
foreach (var item in countries)
{
Console.WriteLine("{0} {1}", item.Country, item.Count);
foreach (var name in item.Racers)
{
Console.Write("{0};", name);
}
Console.WriteLine();
}
Console.ReadLine();
- 内连接
var racers = from r in Formula1.GetChampions()
from y in r.Years
select new
{
Year = y,
Name = r.FirstName + " " + r.LastName
};
var teams = from t in Formula1.GetContructorChampions()
from y in t.Years
select new
{
Year = y,
Name = t.Name
};
var racersAndTeams = (from r in racers
join t in teams on r.Year equals t.Year
select new
{
r.Year,
Champion = r.Name,
Constructor = t.Name
}).Take();
Console.WriteLine("Year World Champio\t Constructor Title");
foreach (var item in racersAndTeams)
{
Console.WriteLine("{0}:{1,-20} {2}", item.Year, item.Champion, item.Constructor);
}
Console.ReadLine();
- 左外连接
var racers = from r in Formula1.GetChampions()
from y in r.Years
select new
{
Year = y,
Name = r.FirstName + " " + r.LastName
};
var teams = from t in Formula1.GetContructorChampions()
from y in t.Years
select new
{
Year = y,
Name = t.Name
};
var racersAndTeams = (from r in racers
join t in teams on r.Year equals t.Year into rt
from t in rt.DefaultIfEmpty()
orderby r.Year
select new
{
r.Year,
Champion = r.Name,
Constructor = t == null ? "no constructor championship" : t.Name
}).Take();
Console.WriteLine("Year World Champio\t Constructor Title");
foreach (var item in racersAndTeams)
{
Console.WriteLine("{0}:{1,-20} {2}", item.Year, item.Champion, item.Constructor);
}
Console.ReadLine();
- 集合操作
Func<string, IEnumerable<Racer>> racersByCar = car => from r in Formula1.GetChampions()
from c in r.Cars
where c == car
orderby r.LastName
select r;
Console.WriteLine("World champion with Ferrari and McLaren");
foreach (var racer in racersByCar("Ferrari").Intersect(racersByCar("McLaren")))
{
Console.WriteLine(racer);
}
Console.ReadLine();
- 合并
var racerNames = from r in Formula1.GetChampions()
where r.Country == "Italy"
orderby r.Wins descending
select new
{
Name = r.FirstName + " " + r.LastName
};
var racerNamesAndStarts = from r in Formula1.GetChampions()
where r.Country == "Italy"
orderby r.Wins descending
select new
{
LastName = r.LastName,
Starts = r.Starts
};
var racers = racerNames.Zip(racerNamesAndStarts, (first, second) => first.Name + ",starts: " + second.Starts);
foreach (var r in racers)
{
Console.WriteLine(r);
}
Console.ReadLine();
- 分区
;
int numberPages = (int)Math.Ceiling(Formula1.GetChampions().Count() / (double)pageSize);
; page < numberPages; page++)
{
Console.WriteLine("Page {0}", page);
var racers = (from r in Formula1.GetChampions()
orderby r.LastName, r.FirstName
select r.FirstName + " " + r.LastName).Skip(page * pageSize).Take(pageSize);
foreach (var name in racers)
{
Console.WriteLine(name);
}
Console.WriteLine();
}
Console.ReadLine();
- 聚合操作符
var query = from r in Formula1.GetChampions()
let numberYears = r.Years.Count()
orderby numberYears descending, r.LastName
select new
{
Name = r.FirstName + " " + r.LastName,
TimesChampion = numberYears
};
foreach (var r in query)
{
Console.WriteLine("{0} {1}", r.Name, r.TimesChampion);
}
var countries = (from c in
from r in Formula1.GetChampions()
group r by r.Country into c
select new
{
Country = c.Key,
Wins = (from r1 in c select r1.Wins).Sum()
}
orderby c.Wins descending, c.Country
select c
).Take();
foreach (var country in countries)
{
Console.WriteLine("{0} {1}", country.Country, country.Wins);
}
Console.ReadLine();
- 转换操作符
在迭代中使用查询时,查询才会执行,使用转换操作符会立即执行查询,把查询结果放在数组、列表或字典中。
List<Racer> racers = (from r in Formula1.GetChampions()
orderby r.Starts descending
select r).ToList();
foreach (var racer in racers)
{
Console.WriteLine("{0} {0:S}", racer);
}
Console.ReadLine();
*如果在非类型化集合上使用LINQ查询,为了定义强类型化的查询,就可以使用Cast()方法。
- 生成操作符
, ).Select(n => n * );
foreach (var item in values)
{
Console.WriteLine("{0} ", item);
}
Console.ReadLine();
《C#高级编程》学习总结之LINQ的更多相关文章
- Asp.net MVC4高级编程学习笔记-视图学习第一课20171009
首先解释下:本文只是对Asp.net MVC4高级编程这本书学习记录的学习笔记,书本内容感觉挺简单的,但学习容易忘记,因此在边看的同时边作下了笔记,可能其它朋友看的话没有情境和逻辑顺序还请谅解! 一. ...
- Unix环境高级编程学习笔记——fcntl
写这篇文正主要是为了介绍下fcntl,并将我自己在学习过程中的一些理解写下来,不一定那么官方,也有错误,希望指正,共同进步- fcntl: 一个修改一打开文件的性质的函数.基本的格式是 int fcn ...
- jquery高级编程学习
jquery高级编程 第1章.jQuery入门 类型检查 对象 类型检查表达式 String typeof object === "string" Number typeof ob ...
- Unix环境高级编程学习笔记——dup
dup 和 dup2 dup和dup2,都是用来将一个文件描述符复制给另一个文件描述符上,这两个文件描述符都指向同一个文件状态标志上. 只是文件描述符的大小不一样,dup所执行下的复制,肯定是返回 ...
- Asp.net MVC4高级编程学习笔记-视图学习第三课Razor页面布局20171010
Razor页面布局 1) 在布局模板页中使用@RenderBody标记来渲染主要内容.比如很多web页面说头部和尾部相同,中间内容部分使用@RenderBody来显示不同的页面内容. 2) 在布局 ...
- Asp.net MVC4高级编程学习笔记-模型学习第四课基架与模型绑定20171027
MVC模型 一.构建基架. MVC中的基架可以为应用程序提供CURD各种功能生成所需要的样板代码.在添加控制器的时候可以选择相应的模板以及实体对象来生成相应的模板代码. 首先定义一个模型类如下所示: ...
- Asp.net MVC4高级编程学习笔记-模型学习第五课MVC表单和HTML辅助方法20171101
MVC表单和HTML辅助方法 一.表单的使用. 表单中的action与method特性.Action表示表单要提交往那里,因此这里就有一个URL.这个URL可以是相对或绝对地址.表单默认的method ...
- [ASP.NET MVC4高级编程] 学习记录(一)
理论: 先有GUI在发展,当用户按下某个键,某个进程会监听到这个动作,这个进程就是控制器.这就是MVC模式. 后来有了事件驱动编程,响应动作的是按钮本身,而不是控制器. 再后来webForm中,事件驱 ...
- Javascript高级编程学习笔记(97)—— WebGL(3) WebGL上下文(1)
WebGL上下文 在支持WebGL的浏览器中,WebGL的名字为 "experimental-webgl",这是由于 webgl 的规范仍未制定完成 制定完成后名字就会改为简单的 ...
- Javascript高级编程学习笔记(57)—— 事件(1)事件流
事件 JS与HTML的交互是通过事件实现的 而事件指的就是:文档或浏览器窗口特定的交互瞬间 可以通过侦听器来预定事件,以便在事件发生时执行相应的代码 这种模式也是设计模式中的观察者模式 事件流 有了事 ...
随机推荐
- 禁用ViewPager边界滑动效果(转)
反射设置方法 private EdgeEffectCompat leftEdge; private EdgeEffectCompat rightEdge; public void DisableLRS ...
- Ue4的容器(数据结构)
之前都没注意,作为程序眼这些还是比较重要的 Engine\Source\Runtime\Core\Public\Containers\
- Ruby Gem命令详解
转自:http://www.jianshu.com/p/728184da1699 Gem介绍: Gem是一个管理Ruby库和程序的标准包,它通过Ruby Gem(如 http://rubygems.o ...
- Java-Android【2】-弹出对话框
一.在Activity的方法中加入代码 new AlertDialog.Builder(this) .setTitle("Title") .setMessage("Mes ...
- mac 终端常用命令
1.复制文件内容到剪贴板:pbcopy < ~/.ssh/id_rsa.pub. 2.ssh key 的生成,参考mac ssh key 的获取. 3.sourcetree 需要输入的密码,指的 ...
- 【转】你所不知道的Android Studio调试技巧
这篇写Android studio debug技巧个人觉得写得不错,转自:http://www.jianshu.com/p/011eb88f4e0d# Android Studio目前已经成为开发An ...
- 使用iframe的优缺点,为什么少用iframe以及iframe和frame的区别。
注:HTML5不再支持使用frame,iframe只有src 属性一.使用iframe的优缺点优点:1.程序调入静态页面比较方便;2.页面和程序分离;缺点:1.iframe有不好之处:样式/脚本需要额 ...
- git学习笔记一
一.概念理解 1.理解工作区和暂存区以及版本库 工作区我理解就是我们创建的程序所在的文件夹,比如test文件夹.其中有个.git文件,这个就是版本库,其中版本库中有个区域叫暂存区或叫索引. 截自廖雪峰 ...
- 快速定位性能瓶颈,检查出所有资源(CPU、内存、磁盘IO等)的利用率(utilization)、饱和度(saturation)和错误(error)度量,即USE方法
命令:uptime说明:查看机器分别在1分钟.5分钟.15分钟的平均负载情况,显示的数字表示等待cpu资源的进程和阻塞在不可中断io进程的数量,如果1分钟的平均负载很高,而15分钟的平均负载很低,说明 ...
- Unity3D UGUI之DoTweenAnimation脚本控制动画方法
DOTweenAnimation脚本: Loops循环:-1时即永久循环播放. Loops Type 是选择播放模式. Ease属性里有很多,暂时只知道Linear的效果,其他有待单独写. ID下面可 ...