using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace 各种小程序测试
{
/*linq 使用起来比较方便,对于takeWhile我们很容易想当然的认为它能实现查找出符合条件的集合,
* 但是实际应用是,她所进行的筛选的集合中一旦有项不能满足条件,她便终止了查询,将目前的结果返回去了。
* 一般情况下,我们把她的功能想象成了takeWhere,殊不知她贵姓While,实现的是While的功能*/
/*
* TakeWhile在LINQ中实现的思想是:对数据源进行枚举,从第一个枚举得到的元素开始,
* 调用客户端传入的predicate( t.Age==10),如果这个predicate委托返回true的话,则将该元素作为Current元素返回给客户端,
* 并且,继续进行相同的枚举,判断操作.但是,一旦predicate返回false的话,MoveNext()方法将会返回false,枚举就此打住,忽略剩下的所有元素.
* 类似的,SkipWhile也对数据源进行枚举,从第一个枚举得到的元素开始,调用客户端的predicate,如果返回true,则跳过该元素,
* 继续进行枚举操作.但是,如果一旦predicate返回为false,则该元素以后的所有元素,都不会再调用predicate,而全部枚举给客户端.
*/
/* 一般使用的是where的用法*/
/* 也可使用一般的select 来选取其中的部分内容或新的结构*/
public class LinqTakeWhile使用场景陷阱
{
public void takeWhileTest()
{
List<Employee> List = new List<Employee>();
Employee e1 = new Employee { ID = 1, Name = "A", Age = 10, Sex = 1 };
Employee e2 = new Employee { ID = 3, Name = "M", Age = 30, Sex = 0 };
Employee e3 = new Employee { ID = 2, Name = "B", Age = 40, Sex = 1 };
Employee e4 = new Employee { ID = 4, Name = "S", Age = 19, Sex = 0 };
Employee e5 = new Employee { ID = 6, Name = "X", Age = 18, Sex = 1 };
Employee e6 = new Employee { ID = 7, Name = "W", Age = 20, Sex = 0 };
Employee e7 = new Employee { ID = 8, Name = "C", Age = 10, Sex = 1 };
Employee e8 = new Employee { ID = 9, Name = "Z", Age = 30, Sex = 0 };
Employee e9 = new Employee { ID = 10, Name = "Q", Age = 40, Sex = 1 };
Employee e10 = new Employee { ID = 11, Name = "X", Age = 19, Sex = 0 };
Employee e11 = new Employee { ID = 12, Name = "Y", Age = 18, Sex = 1 };
Employee e12 = new Employee { ID = 5, Name = "Z", Age = 20, Sex = 0 };
List.Add(e1);
List.Add(e2);
List.Add(e3);
List.Add(e4);
List.Add(e5);
List.Add(e6);
List.Add(e7);
List.Add(e8);
List.Add(e9);
List.Add(e10);
List.Add(e11);
List.Add(e12);
var test1 = List.TakeWhile(t=>t.Age==10);//1个 A 10
var test2 = List.TakeWhile(t=>t.Age==30);//0个
var test3 = List.TakeWhile(t=>t.Age>=20&& t.Age<=30);//0个
var test4 = List.SkipWhile(t=>t.Age==10);//11个 去掉 1 A10
var test5 = List.SkipWhile(t=>t.Age<20 || t.Age>30);//11个
var test6 = List.Where(t=>t.Age == 10 || t.Age ==20);//4 age ==10 的 和age == 30的
var test7 = List.Select(t=>t.Age);
var test8 = from g in List
where g.Age > 30
select g;
var test9 = List.SelectMany(ss=>from s in List where s.Age>30 select s);//将结果选取了12次
//test2 转换成一般的while语句如下
List<Employee> normWhile = new List<Employee>();
int i = 0;
int j=List[0].Age;
while (j==30&& i<List.Count())
{
j = List[i].Age;
normWhile.Add(List[i]);
i++;
}
if (normWhile.Count() != 0)
{
Console.WriteLine("normWhile:");
foreach (var tw in test1)
{
Console.WriteLine("Name:{0} Age:{1}", tw.Name, tw.Age);
}
}
else {
Console.WriteLine("normWhile:无结果");
}
Console.WriteLine("test1:{0},test2:{1},test3:{2},test4:{3},test5:{4}",test1.Count(),test2.Count(),test3.Count(),test4.Count(),test5.Count());
if (test1.Count() != 0)
{
Console.WriteLine("Test1:");
foreach(var tw in test1)
{
Console.WriteLine("Name:{0} Age:{1}", tw.Name, tw.Age);
}
}
if (test2.Count() != 0)
{
Console.WriteLine("Test2:");
foreach (var tw in test2)
{
Console.WriteLine("Name:{0} Age:{1}", tw.Name, tw.Age);
}
}
if (test3.Count() != 0)
{
Console.WriteLine("Test3:");
foreach (var tw in test3)
{
Console.WriteLine("Name:{0} Age:{1}", tw.Name, tw.Age);
}
}
if (test4.Count() != 0)
{
Console.WriteLine("Test4:");
foreach (var sw in test4)
{
Console.WriteLine("Name:{0} Age:{1}",sw.Name, sw.Age);
}
}
if (test5.Count() != 0)
{
Console.WriteLine("Test5:");
foreach (var sw in test5)
{
Console.WriteLine("Name:{0} Age:{1}", sw.Name, sw.Age);
}
}
Console.ReadLine();
}
}
public class Employee
{
public int ID { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public int Sex { get; set; }
}
}