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; } } }
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报 。