一个让人很容易犯浑的Linq TakeWhile 和SkipWhile

 

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; }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值