C#使用LINQ中Enumerable类方法的延迟与立即执行的控制

2019-12-30 11:42:49王旭

为了方便理解和记忆,将常用的延时执行的Enumerable类方法成员分了下组,具体如下:

1.Take用于从一个序列的开头返回指定数量的元素

2.TakeWhile 用于获取指定序列从头开始符合条件的元素,直到遇到不符合条件的元素为止

3.Skip跳过序列中指定数量的元素

4.SkipWhile 用于跳过序列总满足条件的元素,然会返回剩下的元素


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 延时执行的Enumerable类方法
{
  class Program
  {
    static void Main(string[] args)
    {
      string[] names = { "DebugLZQ","DebugMan","Sarah","Jerry","Tom","Linda","M&M","Jeffery"};
      //1.Take用于从一个序列的开头返回指定数量的元素
      //
      //a.在数组上直接使用Take方法
      foreach (string name in names.Take(3))
      {
        Console.Write("{0}  ", name); 
      }
      Console.WriteLine();
      Console.WriteLine("-----");
      //b.在LINQ返回的IEnumerable<T>序列上使用Take方法
      var query = from string name in names
            where name.Length <=3
            select name;
      foreach (string name in query.Take(1))
      {
        Console.Write("{0}  ",name);
      }
      Console.WriteLine();
      Console.WriteLine("----------------------------");
      Console.ReadKey(false);
      //2.TakeWhile 用于获取指定序列从头开始符合条件的元素,直到遇到不符合条件的元素为止
      //
      var takenames = names.TakeWhile(n => n.Length>4);
      var takenames2 = names.TakeWhile((n,i)=>n.Length<10&&i<3);
      foreach (string name in takenames)
      {
        Console.Write("{0}  ", name);
      }
      Console.WriteLine();
      Console.WriteLine("-----");
      foreach (string name in takenames2)
      {
        Console.Write("{0}  ", name);
      }
      Console.WriteLine();
      Console.WriteLine("----------------------------");
      Console.ReadKey(false);
      //3.Skip跳过序列中指定数量的元素
      //
      foreach (string name in names.Skip(5))
      {
        Console.Write("{0}  ", name);
      }
      Console.WriteLine();
      Console.WriteLine("-----");
      var query_skip = (from name in names
               where name.Length >= 3
               select name).Skip(2);
      foreach (string name in query_skip.Skip(2) )
      {
        Console.Write("{0}  ", name);
      }
      Console.WriteLine();
      Console.WriteLine("----------------------------");
      Console.ReadKey(false);
      //4.SkipWhile 用于跳过序列总满足条件的元素,然会返回剩下的元素
      //跳过名字长度大于3的
      var takenames_SkipWhile = names.SkipWhile(n => n.Length >3);
      foreach (string name in takenames_SkipWhile)
      {
        Console.Write("{0}  ", name);
      }
      Console.WriteLine();
      Console.WriteLine("-----");
      var takenames_SkipWhile2 = names.SkipWhile((n,i)=>n.Length>3&&i>2);
      foreach (string name in takenames_SkipWhile2)
      {
        Console.Write("{0}  ", name);
      }
      Console.WriteLine();
      Console.WriteLine("----------------------------");
      Console.ReadKey(false);

      //小结Take、Skip获得第N到第M个元素
      var names_TakeAndSkip = names.Skip(5).Take(3);

      var names_TakeAndSkip2 = (from name in names
                   select name).Skip(5).Take(3);

      foreach (string name in names_TakeAndSkip)
      {
        Console.Write("{0}  ", name);
      }
      Console.WriteLine();
      Console.WriteLine("-----");
      foreach (string name in names_TakeAndSkip2)
      {
        Console.Write("{0}  ", name);
      }
      Console.WriteLine();
      Console.WriteLine("----------------------------");
      Console.ReadKey(false);

    }
  }
}