日期:2014-05-20  浏览次数:20943 次

LinQ由浅入深(三)

LinQ to Object查询语句例子:
 /// <summary>
        /// LinQ语句
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnQuery_Click(object sender, EventArgs e)
        {
            //LinQ to Object 查询语句部分
            //泛型集合数据persons
            List<string> persons = new List<string>();
            persons.Add("zhang san");
            persons.Add("zhang san feng");
            persons.Add("li si");
            persons.Add("wang wu");
            persons.Add("li ba");
            persons.Add("lao wu");
            persons.Add("zhang xx");
            //输出person中所有的元素
            //var result = from p in persons select p;
            ////输出
            //result.Print();

            //条件
            //var result = from p in persons where p.StartsWith("zhang") select p;
            ////输出
            //result.Print();

            //排序
            //var result = from p in persons orderby p select p;
            //result.Print();
        }

    /// <summary>
    /// 拓展类,只要是静态就可以
    /// </summary>
    public static class ExtraClass
    {
        //为IEnumerable提供输出的方法
        public static void Print(this IEnumerable<int> ie)
        {
            IEnumerator<int> result = ie.GetEnumerator();
            string str = "";
            while (result.MoveNext())
            {
                str += result.Current + "\t";
            }
            MessageBox.Show(str);
        }

Linq高级查询方法:
 聚合类:
  Count,Max/Min,Average
 排序类:
  ThenBy //再排序
 分区类:
  Take,TakeWhile,Skip,SkipWhile
  Take取值,TakeWhile当条件满足的时候才取值
                //Skip跳过几个值,SkipWhile当条件满足的时候才进行跳值,主要用于分页
 集合类:
  Distinct //去掉重复的值
 生成类:
  Range,Repeat

 

——聚合类,排序类
 /// <summary>
        /// Linq的高级方法
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnSenior_Click(object sender, EventArgs e)
        {
            //LinQ to Object 查询高级部分
            //数组数据persons
            int[] arr = { 324,5,2,6534,54,566,6,656,78,80,3234,234,42,342};
            //聚合类Count,Max/Min,Average,Sum........
            //var sum = arr.Sum();//求和
            //var max = arr.Max();//最大值
            //var min = arr.Min();//最小值
            //var avg = arr.Average();//平均值
            //var count = arr.Count();//数组元素个数
            //MessageBox.Show("和:"+sum+"\t 最大值:"+max+"\t 最小值:"+min+"\t 平均值:"+avg+"\t arr的数组元素个数:"+count);

            //排序类
            //var result = arr.OrderBy(p =>p);由小到大
           // var result = arr.OrderBy(p => p.ToString().Substring(0,1));//一次排序
            var result = arr.OrderBy(p=>p.ToString().Substring(0,1)).ThenBy(p=>p);//二次排序
            result.Print();
        }

 

生成类查询方法:
使用生成类查询方法时,需要注意以下几点:
   和其他几类方法不同,Range/Repeat 不是扩展方法,而是普通的静态方法
   Range 只能产生整数序列
   Repeat 可以产生泛型序列
   所有的查询方法都存放在 System.Linq.Enumerable 静态类中

例子:
 /// <summary>
        /// Linq的高级方法
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnSenior_Click(object sender, EventArgs e)
        {
            //LinQ to Object 查询高级部分
            //数组数据persons
            int[] arr = { 324,5,2,6534,54,566,6,656,78,80,3234,234,42,342};
           
            //分区类:Take取值,TakeWhile当条件满足的时候才取值
            //Skip跳过几个值,SkipWhile当条件满足的时候才进行跳值,主要用于分页
            //var result = arr.Skip(3);//跳过三个值,余下的部分会全部输出
            ////var result = arr.Skip(3).Take(3);//跳过3个值,取3个值.
            //result.Print();

            //var result = arr.SkipWhile(p => p>4);//方法体部分是该linq语句提取数据的条件,当第一次遇到条件不成立的情况,就停止执行。
            //result.Print();

            //集合类
            //var result = arr.Distinct();//Distinct()去掉重复的部分
            //result.Print();

            //生成类——(它是一个静态类)
            //var result = System.Linq.Enumerable.Range(10,50);//Range生成一组从10取50个连续的数据
            //var result = System.Linq.Enumerable.Range('a',26);//转换成相应的as码
            //IEnumerable<int> ie = System.Linq.Enumerable.Range('a', 26);
            //IEnumerator<int> result = ie.GetEnumerator();//GetEnumerator()返回一个循环访问集合的枚举器

            ////打印
            //string sum = "";
            //while (result.MoveNext())//.MoveNext()将枚举数推进到集合的下一个元素
            //{
            //    sum += (char)result.Current + "\t";//Current获取集合中的当前元素
            //}
            //MessageBox.Show(sum);
            //result.Print();

            var result = System.Linq.Enumerable.Repeat(50,10);
            result.Print();
        }

     /// <summary>
     /// 拓展类,只要是静态就可以
     /// </summary>
     public static class ExtraClass
     {
  //为IEnumerable提供输出的方法
  public static void Print(this IEnumerable<int> ie)
  {
      IEnumerator<int> result = ie.GetEnumerator();
      string str = "";
      while (result.MoveNext())
      {
   str += result.Current + "\t";
      }
      MessageBox.Show(str);
 }