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; }
}
}
对于predicate的解释和实际用法,在我的blogs中--》
查找List,Array中元素的其他C#写法
中都有文字介绍和例子的演示。
查看全文
相关阅读:
Asp.Net构架(Http请求处理流程)、(Http Handler 介绍)、(HttpModule 介绍)
JQuery中的事件(三)
关于asp.net mvc中的httpModules 与 httpHandler
jQuery中的CSS(二)
JQuery选择器(一)
JavaScript中利用Ajax 实现客户端与服务器端通信(九)
JavaScriptDom操作与高级应用(八)
oracle(二)V$lock 视图中ID1 , ID2 列的含义
关于static、内部类
oracle(一)复习起航
原文地址:https://www.cnblogs.com/RuiLei/p/814387.html
最新文章
mysqldump 和 sql命令导入sql文件
iconv
discuz uc_server 配置登录
tar
远程拉取,推送文件包
火狐,discuz同步登录问题解决
.gitignore 无效问题
NFS 简介
NFS
Kubernetes kubectl 命令
热门文章
kubectl get 输出格式
Kubernetes 相关概念
Kubernetes 简介
Kubernetes
Docker Compose
Docker Dockerfile
Docker 网络管理
JQuery中的Ajax(六)
JQuery中的工具类(五)
JQuery动画详解(四)
Copyright © 2011-2022 走看看