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()方法处理,其能够是集合的集合变成一个单一的新集合。

public class CorporateData
{
public static Department[] Departments = new Department[]
{
new Department(){Id = "",Name = "法务部"},
new Department(){Id = "",Name = "信息部"},
new Department(){Id = "",Name = "市场部"},
new Department(){Id = "",Name = "财务部"},
new Department(){Id = "",Name = "行政部"}
};
public static Employee[] Employees = new Employee[]
{
new Employee() {No = "",Name = "柳一",CallName = "主管",DepartmentId = ""},
new Employee() {No = "",Name = "徐二",CallName = "主管",DepartmentId = ""},
new Employee() {No = "",Name = "张三",CallName = "主管",DepartmentId = ""},
new Employee() {No = "",Name = "李四",CallName = "主管",DepartmentId = ""},
new Employee() {No = "",Name = "王五",CallName = "主管",DepartmentId = ""},
new Employee() {No = "",Name = "朱六",CallName = "主管",DepartmentId = ""},
new Employee() {No = "",Name = "彦七",CallName = "主管",DepartmentId = ""},
new Employee() {No = "",Name = "毛八",CallName = "主管",DepartmentId = ""},
new Employee() {No = "",Name = "黄九",CallName = "主管",DepartmentId = ""},
new Employee() {No = "",Name = "成十",CallName = "主管",DepartmentId = ""}
}; //集合左外连接处理
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的更多相关文章

  1. thinkphp学习笔记10—看不懂的路由规则

    原文:thinkphp学习笔记10-看不懂的路由规则 路由这部分貌似在实际工作中没有怎么设计过,只是在用默认的设置,在手册里面看到部分,艰涩难懂. 1.路由定义 要使用路由功能需要支持PATH_INF ...

  2. 《C++ Primer Plus》学习笔记10

    <C++ Primer Plus>学习笔记10 <<<<<<<<<<<<<<<<<&l ...

  3. SQL反模式学习笔记10 取整错误

    目标:使用小数取代整数 反模式:使用Float类型 根据IEEE754标识,float类型使用二进制格式编码实数数据. 缺点:(1)舍入的必要性: 并不是所有的十进制中描述的信息都能使用二进制存储,处 ...

  4. golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息

    golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息 Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放 ...

  5. Spring MVC 学习笔记10 —— 实现简单的用户管理(4.3)用户登录显示全局异常信息

    </pre>Spring MVC 学习笔记10 -- 实现简单的用户管理(4.3)用户登录--显示全局异常信息<p></p><p></p>& ...

  6. Hadoop学习笔记(10) ——搭建源码学习环境

    Hadoop学习笔记(10) ——搭建源码学习环境 上一章中,我们对整个hadoop的目录及源码目录有了一个初步的了解,接下来计划深入学习一下这头神象作品了.但是看代码用什么,难不成gedit?,单步 ...

  7. APUE学习笔记——10.9 信号发送函数kill、 raise、alarm、pause

    转载注明出处:Windeal学习笔记 kil和raise kill()用来向进程或进程组发送信号 raise()用来向自身进程发送信号. #include <signal.h> int k ...

  8. SpringMVC:学习笔记(10)——整合Ckeditor且实现图片上传

    SpringMVC:学习笔记(10)——整合Ckeditor且实现图片上传 配置CKEDITOR 精简文件 解压之后可以看到ckeditor/lang下面有很多语言的js,如果不需要那么多种语言的,可 ...

  9. mybatis学习笔记(10)-一对一查询

    mybatis学习笔记(10)-一对一查询 标签: mybatis mybatis学习笔记10-一对一查询 resultType实现 resultMap实现 resultType和resultMap实 ...

  10. Android:日常学习笔记(10)———使用LitePal操作数据库

    Android:日常学习笔记(10)———使用LitePal操作数据库 引入LitePal 什么是LitePal LitePal是一款开源的Android数据库框架,采用了对象关系映射(ORM)的模式 ...

随机推荐

  1. AtCoder - 2566 优先队列

    Let N be a positive integer. There is a numerical sequence of length 3N, a=(a1,a2,…,a3N). Snuke is c ...

  2. XAF ORMDataModel构建的基础资料对象无法被调用显示的解决办法

    修正,其实只要在基础资料类中加入[XafDefaultProperty("名称")]标签即可. namespace NEO.ERP.Module.BusinessObjects.B ...

  3. springboot整合mybatis,redis,代码(一)

    一 搭建项目,代码工程结构 使用idea或者sts构建springboot项目 二  数据库sql语句 SQLyog Ultimate v12.08 (64 bit) MySQL - 5.7.14-l ...

  4. python get() 和getattr()

    get() Python 字典 get() 函数返回指定键的值,如果值不在字典中返回默认值. 语法: dict.get(key, default=None) 实例1: d={'A':1,'b':2} ...

  5. git 设置代理.

    git 设置代理:(因为网络有时太慢,需要用到 ss 代理..) git config --global http.proxy http://127.0.0.1:1080 取消 代理 git conf ...

  6. Foremost恢复Linux中已删除的文件

    Foremost 我们只能在Linux中恢复已删除的文件,只要这些扇区在硬盘上没有被覆盖. 首先安装 要在CentOS上安装Foremost,我们将从官方网页下载并安装最前面的rpm.打开终端并执行以 ...

  7. [JLOI2015]管道连接(斯坦纳树)

    [Luogu3264] 原题解 多个频道,每个频道的关键点要求相互联通 详见代码,非常巧妙 #include<cstdio> #include<iostream> #inclu ...

  8. HDU 6325 Problem G. Interstellar Travel(凸包)

    题意: 给你n个点,第一个点一定是(0,0),最后一个点纵坐标yn一定是0,中间的点的横坐标一定都是在(0,xn)之间的 然后从第一个点开始飞行,每次飞到下一个点j,你花费的价值就是xi*yj-xj* ...

  9. 本地安全策略命令行secedit设置本地账户安全策略

    我们日常运行的控制台程序secpol.msc里面的内容,实质可以通过命令行完成,下面演示通过secedit命令来设置本地账号密码策略,启用密码复杂性和强制长度至少8位操作办法. ==> 新建文本 ...

  10. Http多线程下载文件

    package unit; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputSt ...