zoukankan      html  css  js  c++  java
  • c#新语法学习笔记

    1.匿名类

    匿名类编译之后会生成一个具体的泛型类,匿名类的属性是只读的。在临时数据传递时非常方便(linq查询)。匿名类中不能有方法。数据传输(json),数据查询(linq)
       

    1   var Person = new { Name = "jack", Age = 33 };

    2.匿名方法
    匿名方法编译后会生成一个方法和一个指向该方法的静态的委托对象。匿名方法一定是结合委托使用。一次性使用的方法。匿名方法可以省略参数。

     1 delegate void Say(string s);
     2         static void Main(string[] args)
     3         {          
     4             //1.将匿名方法指向委托的对象,相当于jquery中的匿名方法
     5             Say s = delegate(string ss){
     6                 Console.WriteLine(ss);
     7             };
     8             //2.第二种写法,在lambda表达式中比较常用,编译后也会生成这样的
     9             //Say s = (string ss)=>{ Console.WriteLine(ss);};
    10             s("dd");
    11               Say s1 = delegate{ Console.WriteLine(""); };//省略参数
    12             //3. 将匿名方法指向系统委托
    13             Func<int, int> f = delegate(int c)
    14             {
    15                 return ++c;
    16             };
    17             Console.WriteLine(f(4));
    18             Console.Read();
    19         }

    3.扩展方法
    扩展方法的本质是调用静态方法。当编译器遇见this时,要转成运行时能够认识的语法(特性:ExtensionAttribute)。优先调用实例方法。当你使用其他程序集中的扩展方法时要先将扩展方法所在的程序集导入,并在当前类中引用命名空间。扩展方法可以被继承。

    public static   class MethodExten
        {
            public static string CutStr(this string s, int length)
            {
                return null;
    
            }
        }
    string tag="www";
    tag.CutStr(3);
    MethodExten.CutStr(tag, 3);//本质


    4.系统内置委托:


    (1)Action<in T1,….,int T16>,最多可以传入16个参数,无返回值。可以用来遍历集合。
     public delegate void Action<in T1, in T2>(T1 arg1, T2 arg2);
    (2)Predicate<T> 返回bool。public delegate bool Predicate<in T>(T obj);可以用来当条件。
    (3)Comparison<T> 返回int。public delegate int Comparison<in T>(T x, T y); //list.Sort
    (4)Func<in T1,…,in T16,out TResult>,自定义参数类型。public delegate TResult  Func<in T, out TResult>(T arg);
    例题:

     1 static class Program
     2     {
     3         delegate void Say(string s);
     4         static void Main(string[] args)
     5         {
     6             List<int> list = new List<int>() { 4, 7, 2, 7 };
     7 
     8             //1.系统委托1 Action<T>
     9             Action<int> a = delegate(int i) { Console.WriteLine(++i); };
    10             //利用系统委托aciton遍历集合           
    11             //list.ForEach(new Action<int>(delegate(int i) { Console.WriteLine(i); }));//同下
    12             list.ForEach(delegate(int i) { Console.WriteLine(i); });
    13             a(4);
    14 
    15             //2.系统委托2 Predicate<T> 返回bool     
    16             list = list.FindAll(delegate(int i) { return i > 4; });
    17 
    18             //3.系统委托3 Comparison<T> 返回int 传入两个参数
    19             list.Sort(new Comparison<int>(delegate(int x, int y) { return x - y; }));
    20 
    21             //4.系统委托4 Func 自定义参数的委托,最后一个参数为返回值类型
    22             List<Dog> dogList = new List<Dog>() { new Dog() { Name = "jack", Age = 33 } };
    23             var smallDogList= dogList.GetSelect<Dog, SmallDag>(
    24                 delegate(Dog d) { return new SmallDag() { Name = d.Name };
    25                 });
    26             //*****系统select扩展方法---简化过程
    27 
    28             dogList.Select(new Func<Dog, SmallDag>(delegate(Dog c) { return new SmallDag { Name = c.Name }; }));
    29             //将已知的对象转换成匿名类----将大量使用--因为无法确认返回类型,所以必须用var
    30             var dlist= dogList.Select(delegate(Dog c) { return new { Name = c.Name }; });
    31       dogList.Select((Dog c) => { return new { Name = c.Name }; });//简写版(lambda)
    32             dogList.Select((c) =>{ return new { Name = c.Name }; });//省略参数类型
    33             dogList.Select(c => { return new { Name = c.Name }; });//一个参数省略小括号,多个参数不能省略
    34             dogList.Select(c =>new { Name = c.Name });//方法体只有一句时,省略return和花括号,如果有多条语句则必须加return 和花括号。
    35             Console.Read();
    36         }
    37         //select扩展方法本质说明
    38         static List<U> GetSelect<T, U>(this List<T> l, Func<T, U> func)
    39         {
    40             List<U> list = new List<U>();
    41             foreach (T item in l)
    42             {
    43                 list.Add(func(item));
    44             }
    45             return list;
    46         }
    47     }
    48 
    49     class Dog
    50     {
    51         public string Name { get; set; }
    52         public int Age { get; set; }
    53     }
    54     class SmallDag
    55     {
    56         public string Name { get; set; }
    57    }


    5.Lambda表达式


    Lambda表达式:Lambda不使用delegate关键字,而使用  Lambda运算符 =>。Lambda的本质是匿名方法,匿名方法的本质是委托,委托的本质是类。
    标准查询运算符(SQO):定义在System.Linq.Enumerable类中的50多个为IEnumerable<T>准备的扩展方法,这些方法用来对它操作的集合进行查询筛选.例如:where(),select(),orderby(),count(),join()等等。
    例题:

     1 //join 等值连接  ????左外连接呢,怎么写(linq解决)
     2             var lists= listDog.Join(listToy, d => d.Id, t => t.DogId, (d, t) => new {DogId=d.Id,DogName=d.Name,DToyName=t.ToyName }).ToList();
     3             lists.ForEach(c=>Console.WriteLine(c));
     4 //linq的等值连接
     5             var r = (from d in listDog
     6                      join t in listToy
     7                      on d.Id equals t.DogId
     8                      select new {
     9                          DogId = d.Id, DogName = d.Name, DToyName = t.ToyName
    10                      }).ToList();
    11 //linq的左外连接
    12 var r = (from d in listDog
    13                     join t in listToy
    14                     on d.Id equals t.DogId
    15                     into temp
    16                     from ts in temp.DefaultIfEmpty()
    17                      select new { DogId = d.Id, DogName = d.Name, DToyName = (ts==null?"不存在":ts.ToyName) }).ToList();
    18             r.ForEach(c => Console.WriteLine(c));
    19 
    20   //group 分组查询
    21             IEnumerable<IGrouping<int,Dog>> groups= listDog.GroupBy(d=>d.Age);//获得多个组
    22             foreach (var group in groups)
    23             {
    24                 Console.WriteLine("按年龄分组:"+group.Key+"----此组共有:"+group.Count());
    25                 foreach (var item in group)//循环每组(有多个Dog)
    26                 {
    27                     Console.WriteLine(item.Name);
    28                 }
    29                 Console.WriteLine("--------------");
    30             }
    31 
    32   //skip take  分页  每页两行
    33             int pageSize = 2;
    34             int pageIndex=8;
    35             var pageList= listDog.OrderByDescending(d=>d.Id).Skip((pageIndex-1)*pageSize).Take(pageSize);
    36 
    37 static List<Dog> GetDogList()
    38         {
    39             List<Dog> dog = new List<Dog> {
    40             new Dog(){ Id=1,Name="jack",Age=22},
    41             new Dog(){ Id=2,Name="tom",Age=12},
    42             new Dog(){ Id=3,Name="loly",Age=32},
    43             new Dog(){ Id=4,Name="kimi",Age=22},
    44             new Dog(){ Id=5,Name="lily",Age=42},
    45             new Dog(){ Id=6,Name="saly",Age=39},
    46             };
    47             return dog;
    48         }
    49         static List<DogToy> GetDogToyList()
    50         {
    51             List<DogToy> dog = new List<DogToy> {
    52             new DogToy(){  DogId=1, ToyName="dd"},
    53             new DogToy(){  DogId=2, ToyName="沙发"},
    54             new DogToy(){  DogId=7, ToyName="沙发"}
    55            
    56             };
    57             return dog;
    58         }

    6. LINQ


    Linq:编译后的IL又生成了标准查询运算符(lambda)。标准运算符中除了分页的方法都能转换成linq。
    例题:

     1 //连接 多表查询---下面为等值连接即内连接
     2 var data = from p in ps
     3 join a in ana on p.PID equals a.PID
     4 select new {PID=p.PID,PName=p.Name,PAge=p.Age,PPhone=p.Phone,AID=a.AID,AName=a.Name };
     5 foreach (var item in data)
     6 {
     7 Console.WriteLine(item.PID+"--"+item.PName+"--"+item.PAge+"--"+item.PPhone+"--"+item.AID+"--"+item.AName);
     8 }
     9 Console.WriteLine("----------------左连接------------------------");
    10 //左连接的写法
    11 var data1 = from p in ps
    12 join a in ana on p.PID equals a.PID
    13 into temp //临时表
    14 from t in temp.DefaultIfEmpty()
    15 select new { PID = p.PID, PName = p.Name, PAge = p.Age, PPhone = p.Phone, AID =( t!=null?t.AID:0), AName = (t!=null?t.Name:"null")};
    16 foreach (var item in data1)
    17 {
    18 Console.WriteLine(item.PID + "--" + item.PName + "--" + item.PAge + "--" + item.PPhone + "--" + item.AID+ "--" + item.AName);
    19 }



    作者:梦亦晓,转载请注明出处
    如果此文能给您提供帮助,请点击右下角的【推荐
    如果您对此文有不同的见解或者意见,欢迎留言讨论
  • 相关阅读:
    python的三个函数map、filter、reduce详解
    python 对文件进行切分行
    sed 命令匹配行操作
    停止学习框架
    JS中双等号“==”使用情况
    JavaScript中数组迭代方法
    JavaScript中replace()方法的第二个参数解析
    Vue生命周期
    JS中浮点数精度误差解决
    大量DOM操作的解决方案
  • 原文地址:https://www.cnblogs.com/eggTwo/p/3500666.html
Copyright © 2011-2022 走看看