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; }
}
}
查看全文
相关阅读:
二路归并排序简介及其并行化 分类: 算法与数据结构 2015-05-08 17:46 112人阅读 评论(0) 收藏
基数排序简介及其并行化 分类: 算法与数据结构 2015-05-08 10:10 59人阅读 评论(0) 收藏
常见排序算法分类 分类: 算法与数据结构 2015-05-08 00:49 31人阅读 评论(0) 收藏
浅谈new operator、operator new和placement new 分类: C/C++ 2015-05-05 00:19 41人阅读 评论(0) 收藏
OpenMP对于嵌套循环应该添加多少个parallel for 分类: OpenMP C/C++ Linux 2015-04-27 14:48 53人阅读 评论(0) 收藏
C++实现不能被继承的类——终结类 分类: C/C++ 2015-04-06 14:48 64人阅读 评论(0) 收藏
oracle数据库的随堂笔记(四)-定义并使用变量
oracle数据库的随堂笔记(三)-过程、函数、触发器
oracle数据库的随堂笔记(二)-块
oracle数据库的随堂笔记(一)-常用操作
原文地址:https://www.cnblogs.com/qfb620/p/1116014.html
最新文章
遗传算法MATLAB实现(3):多元函数优化举例
遗传算法MATLAB实现(2):一元函数优化举例
遗传算法MATLAB实现(1):工具箱下载及安装
【转载】遗传算法及matlab实现
交通巡警调度
LaTeX Error: File `slashbox.sty' not found. 解决办法
AtCoder Beginner Contest 077 C Snuke Festival(二分)
Project Euler Problem 21-Amicable numbers
Project Euler Problem 18-Maximum path sum I & 67-Maximum path sum II
Project Euler Problem 16-Power digit sum
热门文章
Project Euler Problem 15-Lattice paths
Project Euler Problem 14-Longest Collatz sequence
Project Euler Problem 12-Highly divisible triangular number
CODE FESTIVAL 2017 qual B D 101 to 010(dp)
AtCoder Beginner Contest 075 D Axis-Parallel Rectangle
AtCoder Beginner Contest 075 C Bridge(割边)
*** glibc detected *** malloc(): memory corruption 分类: C/C++ Linux 2015-05-14 09:22 37人阅读 评论(0) 收藏
认识C++中的临时对象temporary object 分类: C/C++ 2015-05-11 23:20 137人阅读 评论(0) 收藏
利用OpenMP实现埃拉托斯特尼(Eratosthenes)素数筛法并行化 分类: 算法与数据结构 2015-05-09 12:24 157人阅读 评论(0) 收藏
C/C++的四大内存分区 分类: C/C++ 2015-05-09 01:36 163人阅读 评论(0) 收藏
Copyright © 2011-2022 走看看