C#学习笔记10
2017-01-23 18:34
169 查看
1.匿名类型:匿名类型是C#3.0新增的特性,是强类型(由编译器后台在生成为CIL时,自动声明的代码定义类型),声明与初始化属性后其属性是尽读属性。只有在属性的名称、顺序、类型一致时,多个声明匿名变量才会共用同一个匿名类型。其ToString()方法已重写了返回的是属性名称与值的文本。
2.隐式局部变量:在使用var声明局部变量时,应该注意2点,分别为
(1)可以从赋值“=”右边的类型明显知道左边的类型声明,如 new FileInfo("") 可以明确知道是文件烈性,可以使用var。但是右边若是一个方法调用,则应该显式声明类型。便于知道返回类型,而不用进入方法内部查看。
(2)一般在使用匿名类型时可以使用var,因为不能明确知道编译生成的类型。但在使用Linq等标准查询运算符中应该使用显式声明,如IEnumerable<string> result 比 var result更具可读性。
3.foreach循环内不要修改集合。
4.集合初始化器:集合初始化器要想编译成功,需要满足2点中的一点,分别为
(1)理想情况下,集合应该实现了ICollecation<T>接口,这样就可以保证集合支持一个Add()方法,编译器生成的代码可以调用这个Add()方法,
(2)宽松情况下,集合应该实现了IEnumerable<T>接口,其存在一个或多个Add()方法,即使集合类型没有实现ICollecation<T>接口,Add()方法需要接受与集合初始化器中指定的值兼容的参数。
注意,匿名类型是不能直接使用集合初始化器的,因为集合初始化器需要执行一次构造器的调用,但你根本没法命名这个构造器。有2种方式,
(1)定义一个像下面这样的方法,通过调用该方法即可创建匿名类型的集合,(static List<T> CreateList<T>(T t) { return new List<T>();})。
(2)使用数组处理,如 var items = new[] {...}。
5.标准查询运算符:在使用where()与select()时,是对集合进行垂直与水平方向的数据处理。在使用Linq中,大部分是延迟执行的动作,因此使用中应该注意是否有立即执行的需要,在.Net4.0中添加了PLinq(并行Linq)功能,使用集合的AsParallel(),它是ParallelEnumerable类的一个成员,是一个扩展方法。然后即可使用并行查询或过滤数据,
如list.AsParallel().Where(t=>t.Name.StartWith("A"))。
6.在使用Linq进行升序排序时,第一个排序方法要使用OrderBy(),后面其他排序使用ThenBy(),降序同理。
7.Join与GroupJoin:前者为2个集合的内联接(等同sql的inner Join);后者为分组联接(实现一对多关系),即左边集合分组后对应的右边集合那些元素。
8.左外联:使用GroupJoin().SelectMany()和DefaultIfEmpty()来实现的,可查看CorporateData.GetLeftInnerData()方法中的代码。
9.我们偶尔会处理有集合构成的集合,若有获得其中每一项需要双重的嵌套遍历,这里可以使用SelectMany()方法处理,其能够是集合的集合变成一个单一的新集合。
---------------------------以上内容根据《C#本质论 第三版》进行整理
2.隐式局部变量:在使用var声明局部变量时,应该注意2点,分别为
(1)可以从赋值“=”右边的类型明显知道左边的类型声明,如 new FileInfo("") 可以明确知道是文件烈性,可以使用var。但是右边若是一个方法调用,则应该显式声明类型。便于知道返回类型,而不用进入方法内部查看。
(2)一般在使用匿名类型时可以使用var,因为不能明确知道编译生成的类型。但在使用Linq等标准查询运算符中应该使用显式声明,如IEnumerable<string> result 比 var result更具可读性。
3.foreach循环内不要修改集合。
4.集合初始化器:集合初始化器要想编译成功,需要满足2点中的一点,分别为
(1)理想情况下,集合应该实现了ICollecation<T>接口,这样就可以保证集合支持一个Add()方法,编译器生成的代码可以调用这个Add()方法,
(2)宽松情况下,集合应该实现了IEnumerable<T>接口,其存在一个或多个Add()方法,即使集合类型没有实现ICollecation<T>接口,Add()方法需要接受与集合初始化器中指定的值兼容的参数。
注意,匿名类型是不能直接使用集合初始化器的,因为集合初始化器需要执行一次构造器的调用,但你根本没法命名这个构造器。有2种方式,
(1)定义一个像下面这样的方法,通过调用该方法即可创建匿名类型的集合,(static List<T> CreateList<T>(T t) { return new List<T>();})。
(2)使用数组处理,如 var items = new[] {...}。
5.标准查询运算符:在使用where()与select()时,是对集合进行垂直与水平方向的数据处理。在使用Linq中,大部分是延迟执行的动作,因此使用中应该注意是否有立即执行的需要,在.Net4.0中添加了PLinq(并行Linq)功能,使用集合的AsParallel(),它是ParallelEnumerable类的一个成员,是一个扩展方法。然后即可使用并行查询或过滤数据,
如list.AsParallel().Where(t=>t.Name.StartWith("A"))。
6.在使用Linq进行升序排序时,第一个排序方法要使用OrderBy(),后面其他排序使用ThenBy(),降序同理。
7.Join与GroupJoin:前者为2个集合的内联接(等同sql的inner Join);后者为分组联接(实现一对多关系),即左边集合分组后对应的右边集合那些元素。
8.左外联:使用GroupJoin().SelectMany()和DefaultIfEmpty()来实现的,可查看CorporateData.GetLeftInnerData()方法中的代码。
9.我们偶尔会处理有集合构成的集合,若有获得其中每一项需要双重的嵌套遍历,这里可以使用SelectMany()方法处理,其能够是集合的集合变成一个单一的新集合。
public class CorporateData { public static Department[] Departments = new Department[] { new Department(){Id = "1",Name = "法务部"}, new Department(){Id = "2",Name = "信息部"}, new Department(){Id = "3",Name = "市场部"}, new Department(){Id = "4",Name = "财务部"}, new Department(){Id = "5",Name = "行政部"} }; public static Employee[] Employees = new Employee[] { new Employee() {No = "01",Name = "柳一",CallName = "主管",DepartmentId = "1"}, new Employee() {No = "01",Name = "徐二",CallName = "主管",DepartmentId = "1"}, new Employee() {No = "01",Name = "张三",CallName = "主管",DepartmentId = "3"}, new Employee() {No = "01",Name = "李四",CallName = "主管",DepartmentId = "3"}, new Employee() {No = "01",Name = "王五",CallName = "主管",DepartmentId = "2"}, new Employee() {No = "01",Name = "朱六",CallName = "主管",DepartmentId = "2"}, new Employee() {No = "01",Name = "彦七",CallName = "主管",DepartmentId = "4"}, new Employee() {No = "01",Name = "毛八",CallName = "主管",DepartmentId = "4"}, new Employee() {No = "01",Name = "黄九",CallName = "主管",DepartmentId = "4"}, new Employee() {No = "01",Name = "成十",CallName = "主管",DepartmentId = "4"} }; //集合左外连接处理 public static void GetLeftInnerData() { var result = Departments.GroupJoin(Employees, d => d.Id, e => e.DepartmentId, (d, dEmployees) => new { d.Id, d.Name, Employees = dEmployees }) .SelectMany(departmentEmployees => departmentEmployees.Employees.DefaultIfEmpty(), (d, e) => new { d.Name, employee = e }); foreach (var item in result) { Console.WriteLine("department : {0}, employee : {1}", item.Name, item.employee); } } //分组集合 public static void GetGroupBy() { IEnumerable<IGrouping<string, Employee>> result = Employees.GroupBy(e => e.DepartmentId); foreach (IGrouping<string, Employee> item in result) { Console.WriteLine(item.Key); foreach (Employee employee in item) { Console.WriteLine("\t{0}", employee); } } } } public class Department { public string Id; public string Name; } public class Employee { public string No; public string Name; public string CallName; public string DepartmentId; public override string ToString() { return string.Format("Name={0}, CallName={1}", Name, CallName); } }
---------------------------以上内容根据《C#本质论 第三版》进行整理
相关文章推荐
- C#学习笔记10:Try-catch的用法和引用类型、值类型整理
- (原创)c#学习笔记10--定义类成员01--成员定义06--自动属性
- C#学习笔记(10)——再谈委托,不同国家问候的例子
- .Net学习笔记----2015-07-22(C#基础复习10,面向对象2个小练习)
- (原创)c#学习笔记10--定义类成员04--部分类定义
- C#学习笔记10-重写、覆盖和重载
- (原创)c#学习笔记10--定义类成员06--示例应用程序01--规划应用程序
- (原创)c#学习笔记10--定义类成员01--成员定义02--建立方法
- (原创)c#学习笔记10--定义类成员03--接口的实现02--用非公共的可访问性添加属性存取器
- The Key of C# 学习笔记(你今天学到了什么2004-10)
- 44、我的C#学习笔记10
- 2012-04-13 C#基础学习笔记(10)
- (原创)c#学习笔记10--定义类成员01--成员定义03--定义属性
- (原创)c#学习笔记10--定义类成员02--类成员的其他议题01--隐藏基类方法
- 44、我的C#学习笔记10
- (原创)c#学习笔记10--定义类成员06--示例应用程序03--类库的客户应用程序
- (原创)c#学习笔记10--定义类成员05--部分方法定义
- (原创)c#学习笔记10--定义类成员02--类成员的其他议题03--嵌套的类型定义
- (原创)c#学习笔记10--定义类成员01--成员定义05--重构成员
- (原创)c#学习笔记10--定义类成员01--成员定义01--定义字段