• Linq 入门系列 [Take,Skip,TakeWhile,SkipWhile]篇


    ///////////////////////////////////////////
    /Take,Skip,TakeWhile,SkipWhile的例子和解释//
    //////////////////////////////////////////

    class Program
        
    {
            
    #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);
            }


            
    #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


            
    #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


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

        }
  • 相关阅读:
    本地MD5 SHA1 函数 的JS实现
    让用户减少学习成本——后台系统交互心得(二)(原创理论)
    样式库构建规范(转)
    基础css base.css(转)
    更贴近业务及用户——交互设计工作方式转变感言(原创理论)
    三栏布局,中间栏自适应
    你必须知道的【闭包】陷阱和案例-非常好
    css3 基础内容
    VB.Net实现登陆Ftp的方法
    .NET發送郵件功能開發
  • 原文地址:https://www.cnblogs.com/qfb620/p/1116014.html
Copyright © 2020-2023  润新知