zoukankan
html css js c++ java
Linq 入门系列 [Take,Skip,TakeWhile,SkipWhile]篇
/**/
//////////////////////////////////////////
/
/
Take,Skip,TakeWhile,SkipWhile的例子和解释
//
/**/
//////////////////////////////////////////
class
Program
{
DB
#region
DB
private
static
List
<
Student
>
GetStudents()
{
List
<
Student
>
students
=
new
List
<
Student
>
{
new
Student
{ Name
=
"
YOUNG
"
, Age
=
25
, Language
=
"
Chinese
"
}
,
new
Student
{ Name
=
"
JESSIE
"
, Age
=
21
, Language
=
"
Scotland
"
}
,
new
Student
{ Name
=
"
KELLY
"
, Age
=
18
, Language
=
"
English
"
}
,
new
Student
{ Name
=
"
JUNE
"
, Age
=
20
, Language
=
"
Chinese
"
}
,
new
Student
{ Name
=
"
ADRIAN
"
, Age
=
22
, Language
=
"
Italy
"
}
,
new
Student
{ Name
=
"
BRUCE
"
, Age
=
17
, Language
=
"
Scotland
"
}
,
new
Student
{ Name
=
"
BRANT
"
, Age
=
30
, Language
=
"
Germany
"
}
,
new
Student
{ Name
=
"
BEN
"
, Age
=
25
, Language
=
"
Chinese
"
}
}
;
return
students;
}
#endregion
static
void
Main(
string
[] args)
{
List
<
Student
>
studentList
=
GetStudents();
//
Take(studentList);
//
Skip(studentList);
}
Take
#region
Take
public
static
void
Take
<
T
>
(T obj)
{
//
GetElementFromCollect();
//
GetElementFromSelectResult(obj);
//
GetPointElement(obj);
//
ForExampleAboutTakeWhileOrSkipWhile(obj);
}
private
static
void
GetElementFromCollect()
{
Console.WriteLine(
"
<hr>从集合中取固定数量的元素:<br>
"
);
string
[] stringArray
=
{
"
Ajax
"
,
"
Csharp
"
,
"
Javascript
"
,
"
Css Desige
"
,
"
Asp.net
"
,
"
Gis
"
}
;
//
Take将枚举出source中的前count个元素,返回给客户端.
//
Lambda的写法
//
var books = stringArray.Take(3);
//
Linq的写法
var books
=
(from n
in
stringArray
select n).Take(
3
);
foreach
(var book
in
books)
{
Console.WriteLine(
string
.Format(
"
<div class='result'>{0}</div>
"
, book));
}
//
扩展方法写法
//
IEnumerator<String> stu_Lambda = stringArray.Take(3).GetEnumerator();
//
while (stu_Lambda.MoveNext())
//
{
//
Console.WriteLine(stu_Lambda.Current);
//
}
}
private
static
void
GetElementFromSelectResult
<
T
>
(T obj)
{
Console.WriteLine(
"
<hr>从select结果中取固定数量的元素:<br>
"
);
//
Lambda写法
//
var stu = (RevealChangeType(obj).Where(n=>n.Language == "Chinese").Select(n=>new { n.Name, n.Age })).Take(1);
//
Linq写法
var stu
=
(from n
in
RevealChangeType(obj)
where n.Language
==
"
Chinese
"
select
new
{n.Name, n.Age}
).Take(
1
);
foreach
(var student
in
stu)
{
Console.WriteLine(
string
.Format(
"
<div class='result'> name:{0}; age:{1}</div>
"
, student.Name, student.Age));
}
//
扩展方法写法
//
IEnumerator<Student> stu_ExtraMethod = RevealChangeType(obj).Where(n=>n.Language == "Chinese").Take(1).GetEnumerator();
//
while (stu_ExtraMethod.MoveNext())
//
{
//
Console.WriteLine(stu_ExtraMethod.Current.Age);
//
}
}
private
static
void
GetPointElement
<
T
>
(T obj)
{
Console.WriteLine(
"
<hr>取满足指定条件元素:<br>
"
);
//
Lambda写法
//
var stu = RevealChangeType(obj).TakeWhile(student => student.Age > 20);
//
Linq写法
var stu
=
(from n
in
RevealChangeType(obj)
select n).TakeWhile(n
=>
n.Age
>
20
);
foreach
(var student
in
stu)
{
Console.WriteLine(
string
.Format(
"
<div class='result'>{0}</div>
"
, student.Name));
}
//
扩展方法写法
//
IEnumerator<Student> stu_ExtraMethod = RevealChangeType(obj).TakeWhile(student => student.Age > 20).GetEnumerator();
//
while (stu_ExtraMethod.MoveNext())
//
{
//
Console.WriteLine(stu_ExtraMethod.Current.Name);
//
}
//
TakeWhile在LINQ中实现的思想是:
//
对数据源进行枚举,从第一个枚举得到的元素开始-->
//
调用客户端传入的predicate( c.Name == ""woodyN")-->
//
如果这个predicate委托返回true的话,
//
则将该元素作为Current元素返回给客户端,并且,继续进行相同的枚举,判断操作.
//
但是,一旦predicate返回false的话,
//
MoveNext()方法将会返回false,枚举就此打住,忽略剩下的所有元素.
//
所以此方法出来的结果是:
//
<div class='result'>YOUNG</div>
//
<div class='result'>JESSIE</div>
//
因为在KELLYAge=18不符合当前where条件,所以会这样。:)
}
#endregion
Skip
#region
Skip
private
static
void
Skip
<
T
>
(T obj)
{
//
GetRemnantElementAfterJumpCollect();
//
GetRemnantElementAfterFilter(obj);
}
private
static
void
GetRemnantElementAfterJumpCollect()
{
Console.WriteLine(
"
<hr>跳过集合的几个元素后取剩余所有元素:<br>
"
);
string
[] stringArray
=
{
"
Ajax
"
,
"
Csharp
"
,
"
Javascript
"
,
"
Css Desige
"
,
"
Asp.net
"
,
"
Gis
"
}
;
//
Skip则恰好相反,将跳过source中的前count个元素,枚举其余元素.
//
Lambda写法
//
var books1 = stringArray.Skip(3);
//
Linq写法
var books1
=
(from n
in
stringArray
select n).Skip(
3
);
foreach
(var book
in
books1)
{
Console.WriteLine(
string
.Format(
"
<div class='result'>{0}</div>
"
, book));
}
//
扩展方法写法
//
IEnumerator<string> books1_ExtraMethod = stringArray.Skip(3).GetEnumerator();
//
while (books1_ExtraMethod.MoveNext())
//
{
//
Console.WriteLine(books1_ExtraMethod.Current);
//
}
}
private
static
void
GetRemnantElementAfterFilter
<
T
>
(T obj)
{
Console.WriteLine(
"
<hr>将满足指定条件元素过滤后选择剩余的所有元素:<br>
"
);
//
Lambda写法
//
var stu = RevealChangeType(obj).SkipWhile(student => student.Age > 20);
//
Linq写法
var stu
=
(from n
in
RevealChangeType(obj)
select n).SkipWhile(n
=>
n.Age
>
20
);
foreach
(var student
in
stu)
{
Console.WriteLine(
string
.Format(
"
<div class='result'>{0}</div>
"
, student.Name));
}
//
扩展方法写法
//
IEnumerator<Student> stu_ExtraMethod = RevealChangeType(obj).SkipWhile(student => student.Age > 20).GetEnumerator();
//
while (stu_ExtraMethod.MoveNext())
//
{
//
Console.WriteLine(stu_ExtraMethod.Current);
//
}
//
类似的,SkipWhile也对数据源进行枚举,从第一个枚举得到的元素开始,
//
调用客户端的predicate,如果返回true,则跳过该元素,继续进行枚举操作.
//
但是,如果一旦predicate返回为false,则该元素以后的所有元素,都不会再调用predicate,
//
而全部枚举给客户端.
//
所以此方法出来的结果是:
//
<div class='result'>KELLY</div>
//
<div class='result'>JUNE</div>
//
<div class='result'>ADRIAN</div>
//
<div class='result'>BRUCE</div>
//
<div class='result'>BRANT</div>
//
<div class='result'>BEN</div>
//
以上根据这个结果对于linq中TakeWhile,SkipWhile有点认识了。
//
但是我还是建议实际使用时还是要小心使用。
}
#endregion
TakeWhile--SkipWhile
#region
TakeWhile--SkipWhile
private
static
void
ForExampleAboutTakeWhileOrSkipWhile
<
T
>
(T obj)
{
var stu
=
RevealChangeType(obj).TakeWhile(student
=>
student.Age
>
20
);
var stu1
=
RevealChangeType(obj).TakeWhile(student
=>
student.Age
>
18
);
var stu2
=
RevealChangeType(obj).SkipWhile(student
=>
student.Age
>
20
);
var stu3
=
RevealChangeType(obj).SkipWhile(student
=>
student.Age
>
18
);
foreach
(var student
in
stu)
{
Console.WriteLine(
string
.Format(
"
<div class='[TakeWhile(student => student.Age > 20)]result'>{0}</div>
"
, student.Name));
}
foreach
(var student
in
stu1)
{
Console.WriteLine(
string
.Format(
"
<div class='[TakeWhile(student => student.Age > 18)]result'>{0}</div>
"
, student.Name));
}
foreach
(var student
in
stu2)
{
Console.WriteLine(
string
.Format(
"
<div class='[SkipWhile(student => student.Age > 20)]result'>{0}</div>
"
, student.Name));
}
foreach
(var student
in
stu3)
{
Console.WriteLine(
string
.Format(
"
<div class='[SkipWhile(student => student.Age > 18)]result'>{0}</div>
"
, student.Name));
}
//
Runtime Result
//
<div class='[TakeWhile(student => student.Age > 20)]result'>YOUNG</div>
//
<div class='[TakeWhile(student => student.Age > 20)]result'>JESSIE</div>
//
<div class='[TakeWhile(student => student.Age > 18)]result'>YOUNG</div>
//
<div class='[TakeWhile(student => student.Age > 18)]result'>JESSIE</div>
//
<div class='[SkipWhile(student => student.Age > 20)]result'>KELLY</div>
//
<div class='[SkipWhile(student => student.Age > 20)]result'>JUNE</div>
//
<div class='[SkipWhile(student => student.Age > 20)]result'>ADRIAN</div>
//
<div class='[SkipWhile(student => student.Age > 20)]result'>BRUCE</div>
//
<div class='[SkipWhile(student => student.Age > 20)]result'>BRANT</div>
//
<div class='[SkipWhile(student => student.Age > 20)]result'>BEN</div>
//
<div class='[SkipWhile(student => student.Age > 18)]result'>KELLY</div>
//
<div class='[SkipWhile(student => student.Age > 18)]result'>JUNE</div>
//
<div class='[SkipWhile(student => student.Age > 18)]result'>ADRIAN</div>
//
<div class='[SkipWhile(student => student.Age > 18)]result'>BRUCE</div>
//
<div class='[SkipWhile(student => student.Age > 18)]result'>BRANT</div>
//
<div class='[SkipWhile(student => student.Age > 18)]result'>BEN</div>
}
#endregion
}
sealed
class
Student
{
public
int
age;
public
int
Age
{
get
{
return
age; }
set
{ age
=
value; }
}
private
string
name;
public
string
Name
{
get
{
return
name; }
set
{ name
=
value; }
}
private
string
language;
public
string
Language
{
get
{
return
language; }
set
{ language
=
value; }
}
}
查看全文
相关阅读:
为什么ip层收到的报文可能已经设置了路由
由socket fd泄漏想到的一些问题
Html.DropDownLis绑定数据库
CSS 属性备注
获取IP
读取TXT并筛选数据写入新建TXT
C#打印图片
C#生成二维码
NPOI操作Excel
Bootstrap
原文地址:https://www.cnblogs.com/qfb620/p/1116014.html
最新文章
Jedis连接 HelloWorld实现
Jedis简介
jQuery-1.9.1源码分析系列(十五) 动画处理——外篇
jQuery-1.9.1源码分析系列(十五) 动画处理——缓动动画核心Tween
jQuery-1.9.1源码分析系列(十五) 动画处理
jQuery-1.9.1源码分析系列(十四) 一些jQuery工具
jQuery-1.9.1源码分析系列(十三) 位置大小操作
jQuery-1.9.1源码分析系列(十二) 筛选操作
jQuery-1.9.1源码分析系列(十一) DOM操作续——克隆节点
html/css基础篇——DOM中关于脱离文档流的几种情况分析
热门文章
html/css基础篇——关于浏览器window、document、html、body高度的探究
jQuery-1.9.1源码分析系列(十一) DOM操作
gcc如何处理函数的throw属性
ext2文件在延迟删除后遇到系统断电会怎样
TCP建立连接时socket的epoll态及一个可能的状态不一致问题
从IP层TTL递减看校验和及ICMP
键盘按键频率的极限在哪里
从虚拟机磁盘扩容看linux下磁盘管理及ext文件系统
TCP接收方对于重叠报文的处理
TCP_FIN_WAIT1可以等多久
Copyright © 2011-2022 走看看