1.匿名类

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

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

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

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

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

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

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);
例题:

 static class Program
{
delegate void Say(string s);
static void Main(string[] args)
{
List<int> list = new List<int>() { , , , }; //1.系统委托1 Action<T>
Action<int> a = delegate(int i) { Console.WriteLine(++i); };
//利用系统委托aciton遍历集合
//list.ForEach(new Action<int>(delegate(int i) { Console.WriteLine(i); }));//同下
list.ForEach(delegate(int i) { Console.WriteLine(i); });
a(); //2.系统委托2 Predicate<T> 返回bool
list = list.FindAll(delegate(int i) { return i > ; }); //3.系统委托3 Comparison<T> 返回int 传入两个参数
list.Sort(new Comparison<int>(delegate(int x, int y) { return x - y; })); //4.系统委托4 Func 自定义参数的委托,最后一个参数为返回值类型
List<Dog> dogList = new List<Dog>() { new Dog() { Name = "jack", Age = } };
var smallDogList= dogList.GetSelect<Dog, SmallDag>(
delegate(Dog d) { return new SmallDag() { Name = d.Name };
});
//*****系统select扩展方法---简化过程 dogList.Select(new Func<Dog, SmallDag>(delegate(Dog c) { return new SmallDag { Name = c.Name }; }));
//将已知的对象转换成匿名类----将大量使用--因为无法确认返回类型,所以必须用var
var dlist= dogList.Select(delegate(Dog c) { return new { Name = c.Name }; });
      dogList.Select((Dog c) => { return new { Name = c.Name }; });//简写版(lambda)
dogList.Select((c) =>{ return new { Name = c.Name }; });//省略参数类型
dogList.Select(c => { return new { Name = c.Name }; });//一个参数省略小括号,多个参数不能省略
dogList.Select(c =>new { Name = c.Name });//方法体只有一句时,省略return和花括号,如果有多条语句则必须加return 和花括号。
Console.Read();
}
//select扩展方法本质说明
static List<U> GetSelect<T, U>(this List<T> l, Func<T, U> func)
{
List<U> list = new List<U>();
foreach (T item in l)
{
list.Add(func(item));
}
return list;
}
} class Dog
{
public string Name { get; set; }
public int Age { get; set; }
}
class SmallDag
{
public string Name { get; set; }
   }

5.Lambda表达式

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

 //join 等值连接  ????左外连接呢,怎么写(linq解决)
var lists= listDog.Join(listToy, d => d.Id, t => t.DogId, (d, t) => new {DogId=d.Id,DogName=d.Name,DToyName=t.ToyName }).ToList();
lists.ForEach(c=>Console.WriteLine(c));
//linq的等值连接
var r = (from d in listDog
join t in listToy
on d.Id equals t.DogId
select new {
DogId = d.Id, DogName = d.Name, DToyName = t.ToyName
}).ToList();
//linq的左外连接
var r = (from d in listDog
join t in listToy
on d.Id equals t.DogId
into temp
from ts in temp.DefaultIfEmpty()
select new { DogId = d.Id, DogName = d.Name, DToyName = (ts==null?"不存在":ts.ToyName) }).ToList();
r.ForEach(c => Console.WriteLine(c)); //group 分组查询
IEnumerable<IGrouping<int,Dog>> groups= listDog.GroupBy(d=>d.Age);//获得多个组
foreach (var group in groups)
{
Console.WriteLine("按年龄分组:"+group.Key+"----此组共有:"+group.Count());
foreach (var item in group)//循环每组(有多个Dog)
{
Console.WriteLine(item.Name);
}
Console.WriteLine("--------------");
} //skip take 分页 每页两行
int pageSize = ;
int pageIndex=;
var pageList= listDog.OrderByDescending(d=>d.Id).Skip((pageIndex-)*pageSize).Take(pageSize); static List<Dog> GetDogList()
{
List<Dog> dog = new List<Dog> {
new Dog(){ Id=,Name="jack",Age=},
new Dog(){ Id=,Name="tom",Age=},
new Dog(){ Id=,Name="loly",Age=},
new Dog(){ Id=,Name="kimi",Age=},
new Dog(){ Id=,Name="lily",Age=},
new Dog(){ Id=,Name="saly",Age=},
};
return dog;
}
static List<DogToy> GetDogToyList()
{
List<DogToy> dog = new List<DogToy> {
new DogToy(){ DogId=, ToyName="dd"},
new DogToy(){ DogId=, ToyName="沙发"},
new DogToy(){ DogId=, ToyName="沙发"} };
return dog;
}

6. LINQ

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

 //连接 多表查询---下面为等值连接即内连接
var data = from p in ps
join a in ana on p.PID equals a.PID
select new {PID=p.PID,PName=p.Name,PAge=p.Age,PPhone=p.Phone,AID=a.AID,AName=a.Name };
foreach (var item in data)
{
Console.WriteLine(item.PID+"--"+item.PName+"--"+item.PAge+"--"+item.PPhone+"--"+item.AID+"--"+item.AName);
}
Console.WriteLine("----------------左连接------------------------");
//左连接的写法
var data1 = from p in ps
join a in ana on p.PID equals a.PID
into temp //临时表
from t in temp.DefaultIfEmpty()
select new { PID = p.PID, PName = p.Name, PAge = p.Age, PPhone = p.Phone, AID =( t!=null?t.AID:), AName = (t!=null?t.Name:"null")};
foreach (var item in data1)
{
Console.WriteLine(item.PID + "--" + item.PName + "--" + item.PAge + "--" + item.PPhone + "--" + item.AID+ "--" + item.AName);
}

c#新语法学习笔记的更多相关文章

  1. Golang 语法学习笔记

    Golang 语法学习笔记 包.变量和函数. 包 每个 Go 程序都是由包组成的. 程序运行的入口是包 main. 包名与导入路径的最后一个目录一致."math/rand" 包由 ...

  2. 毕业设计 之 五 PHP语法学习笔记

    毕业设计 之 四 PHP语法学习笔记 作者:20135216 平台:windows10 软件:XAMPP,DreamWeaver 说明:该笔记是对网站编程语言的详细学习 一.PHP基础 0. 关于环境 ...

  3. java8 新特性学习笔记

    Java8新特性 学习笔记 1主要内容 Lambda 表达式 函数式接口 方法引用与构造器引用 Stream API 接口中的默认方法与静态方法 新时间日期 API 其他新特性 2 简洁 速度更快 修 ...

  4. MarkDown语法 学习笔记 效果源码对照

    MarkDown基本语法学习笔记 Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式. 下面将对Markdown的基本使用做一个介绍 目 ...

  5. doy05循环语法学习笔记

    doy05循环语法学习笔记 一.while循环语法: 1.基本用法示例 x = 1 while x <= 5: print(x) x += 1 2.死循环:永远不结束的循环 如:while Tr ...

  6. mySql 基本语法学习笔记

     create database if not exists yang;    drop database if exists yang;     show databases;   show dat ...

  7. .net学习之新语法学习(匿名类和匿名方法,扩展方法,系统内置委托,Lambda表达式和linq等)

    1.自动属性 Auto-Implemented Properties 2.隐式类型 var  var变量不能作为全局变量使用,因为不能在编译时确定类型 3.参数默认值 和 命名参数 4.对象初始化器 ...

  8. Swift基本语法学习笔记

    Swift与OC的不同点 导入框架的方式 OC使用#import \<UIKit/UIKit.h> Swift使用import UIKit 定义标识符的方式 Swift中定义标识符,必须指 ...

  9. Mustache.js语法学习笔记

    原文地址:http://www.cnblogs.com/flypig88/archive/2012/05/14/2497780.html 看了Mustache的github,学学其中的语法,做个笔记 ...

随机推荐

  1. Hibernate 缓存介绍

    Hibernate中提供了两级缓存,一级缓存是Session级别的缓存,它属于事务范围的缓存,该级缓存由hibernate管理,应用程序无需干预:二级缓存是SessionFactory级别的缓存,该级 ...

  2. Serena Dimensions 介绍

    Serena Dimensions是配置管理工具,基于进程的软件更改和配置管理解决方案. 官方网址:http://www.serena.com/index.php/en/products/applic ...

  3. ORACLE AWR报告数据的导入导出实践

    关于AWR的快照数据可以导出.导入,一直没有亲手实践过.今天动手测试了一下如何导出.导入AWR数据,将AWR的数据从一测试服务器,导入到另外一台测试服务器. SQL> @?/rdbms/admi ...

  4. jenkins打包成功,部署失败

    环境一直正常,更新了tomcat版本后自动部署报错 ERROR: Publisher hudson.plugins.deploy.DeployPublisher aborted due to exce ...

  5. Oracle12c安装出错

    Database Configuration Assistant安装失败 向广大园友求助

  6. Linux 引导修复

    前些天,我的Ubuntu老提示"Filesystem root"空间不足,于是,我煞笔的用win pe去扩展空间,结果,空间扩展不成,反倒丢失了引导..... 于是就上网查资料,看 ...

  7. Android中使用dimen定义尺寸(转)

    (转自:http://blog.csdn.net/yuzhiboyi/article/details/7696174) 最近,遇到了一种定义尺寸的方法,类似于C里面的宏定义一样,其实以前已经见过了这种 ...

  8. Scala编程第二课

    函数式编程 函数式编程,结构化编程,OO编程都是编程的方法论. 函数式编程主要思想是把运算过程尽量写成一系列嵌套的函数调用. 特点如下: 1.函数可以像其他数据类型一样使用 可以可以赋值给其他变量,可 ...

  9. AC日记——密码翻译 openjudge 1.7 09

    09:密码翻译 总时间限制:  1000ms 内存限制:  65536kB 描述 在情报传递过程中,为了防止情报被截获,往往需要对情报用一定的方式加密,简单的加密算法虽然不足以完全避免情报被破译,但仍 ...

  10. VIM的强大功能

    转发地址:http://coolshell.cn/articles/5426.html 简明 Vim 练级攻略   vim的学习曲线相当的大(参看各种文本编辑器的学习曲线),所以,如果你一开始看到的是 ...