初尝Linq,代码贴出来,有详细的注释

时间:2023-02-03 20:55:45

为了更加深入去理解,所以一开始就没说“如何使用Linq......”。今天只先看了拓展方法和lambda表达式,后续才会慢慢引入Linq,并深入去探究。知其然更知其所以然,是我一贯的学习风格。以下是代码部分。

Code:
  1. using System;   
  2. using System.Collections.Generic;   
  3. using System.ComponentModel;   
  4. using System.Data;   
  5. using System.Drawing;   
  6. using System.Linq;   
  7. using System.Text;   
  8. using System.Windows.Forms;   
  9. using System.Collections;   
  10.   
  11. namespace LinqDemo   
  12. {   
  13.     public partial class Form1 : Form   
  14.     {   
  15.         //定义一个委托   
  16.         public delegate string delTransfer(string s);   
  17.         public Form1()   
  18.         {   
  19.             InitializeComponent();   
  20.         }   
  21.         /// <summary>   
  22.         /// 初试牛刀   
  23.         /// </summary>   
  24.         /// <param name="sender"></param>   
  25.         /// <param name="e"></param>   
  26.         private void btnTry_Click(object sender, EventArgs e)   
  27.         {   
  28.             //找出数组arr中大于50的数,并打印出来  
  29.             #region 没有Linq之前的这么做   
  30.             int[] arr = {7,9,5,4,18,56,3,45,20,123,98 };   
  31.             //ArrayList result = new ArrayList();   
  32.             //for (int i = 0; i < arr.Length; i++)   
  33.             //{   
  34.             //    if (arr[i]>50)   
  35.             //    {   
  36.                     //将>50的数存放在result动态数组中   
  37.             //        result.Add(arr[i]);   
  38.             //    }   
  39.             //}   
  40.             //遍历该动态数组   
  41.             //for (int i = 0; i < result.Count; i++)   
  42.             //{   
  43.             //    Console.WriteLine(result[i]);   
  44.             //}  
  45.             #endregion  
  46.  
  47.  
  48.             #region 有了Linq之后这样迭代   
  49.             IEnumerable ie = arr.Select(p => p).Where(p => p > 50);   
  50.             IEnumerator result = ie.GetEnumerator();   
  51.             while (result.MoveNext())   
  52.             {   
  53.                 Console.WriteLine(result.Current);   
  54.             }  
  55.             #endregion   
  56.         }   
  57.   
  58.         /// <summary>   
  59.         /// 调用拓展方法   
  60.         /// </summary>   
  61.         /// <param name="sender"></param>   
  62.         /// <param name="e"></param>   
  63.         private void btnExtraMethod_Click(object sender, EventArgs e)   
  64.         {     
  65.             string s = "abcdefg";   
  66.             Console.WriteLine(s.ToLower());   
  67.             Console.WriteLine(s.ToUpper());   
  68.   
  69.             // 调用拓展方法 --》拓展方法是一种特殊的静态方法   
  70.             Console.WriteLine(s.toPascal());   
  71.         }   
  72.         //引入Lambda表达式,Linq中大部分都是Lambda表达式,拓展方法   
  73.         private void btnLambda_Click(object sender, EventArgs e)   
  74.         {   
  75.             // 在.net frameWork 1.0中,使用 委托   
  76.           //  delTransfer del = new delTransfer(toPascal);//关联并给委托赋值   
  77.           //Console.WriteLine(del("abcdefg"));//调用委托,调用相对应的方法   
  78.           //在.net framwork 2.0中,使用匿名方法   
  79.             //delTransfer trans = delegate(string s) { return s.Substring(0, 1).ToUpper() + s.Substring(1).ToLower(); };   
  80.             //Console.WriteLine(trans("abcdefg"));   
  81.             //在.net framwork 3.5中,使用Lambda表达式   
  82.             delTransfer trans = s => s.Substring(0, 1).ToUpper() + s.Substring(1).ToLower();   
  83.             Console.WriteLine(trans("abcdefg"));   
  84.         }   
  85.            
  86.         /// <summary>   
  87.         /// 将字符串参数的首字符大写,后面的字母全部小写   
  88.         /// </summary>   
  89.         /// <param name="s"></param>   
  90.         /// <returns></returns>   
  91.         public string toPascal(string s)    
  92.         {   
  93.               
  94.             return s.Substring(0, 1).ToUpper() + s.Substring(1).ToLower();   
  95.         }   
  96.         /// <summary>   
  97.         /// 体验Linq中的拓展方法--Select   
  98.         /// </summary>   
  99.         /// <param name="sender"></param>   
  100.         /// <param name="e"></param>   
  101.         private void btnSelect_Click(object sender, EventArgs e)   
  102.         {   
  103.             List<string> list = new List<string>();   
  104.             list.Add("丁浪");   
  105.             list.Add("艳刘");   
  106.             list.Add("王五");   
  107.             list.Add("李四");   
  108.             list.Add("张三");   
  109.             list.Add("王兴魁");   
  110.             //var reslut = list.Select(p=>p);//查询出所有对象   
  111.             Console.WriteLine(double.MaxValue);   
  112.             //查出以“丁”开头的对象并打印   
  113.             //var reslut = list.Select(p=>p).Where(p => p.StartsWith("丁"));   
  114.             int a = 0;   
  115.             string s = a >= 0 ? "a是正整数" : "a是负数";   
  116.             Console.WriteLine(s);   
  117.             //按姓氏排序   
  118.             //var reslut = list.Select(p=>p).OrderBy(p =>p.Substring(0,1));   
  119.             //reslut.print();   
  120.   
  121.             //按“姓氏”分组   
  122.             var reslut = list.Select(p => p).GroupBy(p => p.Substring(0, 1));   
  123.             foreach (var item in reslut)   
  124.             {   
  125.                 Console.WriteLine("/n-------------------------------/n");   
  126.                 Console.WriteLine("本组人都是姓"+"/'"+item.Key+"/'"+"的");   
  127.                 foreach (var name in item)   
  128.                 {   
  129.                     Console.WriteLine("姓"+"/'"+item.Key+"/'"+"的有:"+name);   
  130.                 }   
  131.                 Console.WriteLine("/n-------------------------------/n");   
  132.             }   
  133.         }   
  134.     }   
  135.       
  136.   
  137.   
  138.     /// <summary>   
  139.     /// 拓展类,拓展方法   
  140.     /// </summary>   
  141.   
  142.     public static class ExtraClass   
  143.     {   
  144.         // 加this关键字,表明为该类型(string)添加了拓展方法   
  145.         public static string toPascal(this string str)    
  146.         {   
  147.             //将字符串参数的首字符大写,后面的字母全部小写   
  148.             return str.Substring(0, 1).ToUpper() + str.Substring(1).ToLower();   
  149.         }   
  150.         public static void print(this IEnumerable<string> ie)    
  151.         {   
  152.             IEnumerator<string> result = ie.GetEnumerator();   
  153.             while (result.MoveNext())    
  154.             {   
  155.                 Console.WriteLine("/n-------------------------------/n");   
  156.                 Console.WriteLine(result.Current);   
  157.                 Console.WriteLine("/n-------------------------------/n");   
  158.             }   
  159.         }   
  160.     }   
  161. }