Lambda表达式
只要有委托参数类型的地方,就可以使用Lambda表达式。常用于Linq的两种语法风格:
查询语法(Query Syntax),这种语法格式类似于SQL查询。
点语法(Dot-nontation Syntax),这种语法是基于拓展方法的。
查询语法的格式:查询表达式必须以from开头,以select或group结束。在这两个子句中间可以使用where,orderby,join,let和其他from子句。
Linq有的方法有延迟的特性,这个特性的效果是直到对结果进行遍历,才会执行该查询。
以下是常见的几种拓展方法:
拓展方法 | 描述 | 延迟 |
All | 如果数据源的所有条目都与谓词匹配,则返回true | 否 |
Any | 如果数据源至少有一个条目与谓词匹配,则返回true | 否 |
Contains | 如果数据源包含指定的条目或值,返回true | 否 |
Count | 返回数据源的条目数 | 否 |
First | 返回数据源的第一个条目 | 否 |
FirstOrDefault | 返回数据源的第一个条目,或无条目时,返回默认值 | 否 |
Last | 返回数据源最后一个条目 | 否 |
LastOrDefault | 返回数据源最后一个条目,或无条目时,返回默认值 | 否 |
Max或Min | 返回由Lamdba表达式表示的最大值或最小值 | 否 |
OrderBy OrderByDesceding | 基于Lambda表示式返回值对数据源进行排序 | 是 |
Reverse | 反转数据源中数据项的顺序 | 是 |
Select | 设计一个查询结果 | 是 |
SelectMany | 把每个数据项投射到一个条目序列中,然后把所有的这些结果序列连接成一个序列 | 是 |
Single | 返回数据源第一个条目,或者有多个匹配时抛出异常 | 否 |
SingleOrDefault | 返回数据源第一个条目,或无条目时,返回默认值;有多个条目匹配时,抛出一个异常 | 否 |
Skip SkipWhile | 跳过指定数目的元素,或者当谓词匹配时跳过 | 是 |
Sum | 对谓词选定的词求和 | 否 |
Take TakeWhile | 从数据源的开始处选择指定数目的元素,或当谓词匹配时选择条目 | 是 |
ToArray ToDictionary ToList | 把数据源转成数组,字典,列表 | 否 |
Where | 过滤数据源中与谓词不匹配的条目 | 是 |
可选参数(Optional parameter)与命名参数(Named parameter)
可选参数能让我们对一些参数赋予默认值,它的作用类似于方法的重载,同一个方法可以有多个不同的参数。
命名参数最大的特点是我们不必再纠结于参数的顺序了,只要知道参数名,就能准确地调用方法。
例子:
方法的定义
/// <summary>
/// 追加一个值到key上
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <remarks>如果 key 已经存在,并且值为字符串,那么这个命令会把 value 追加到原来值(value)的结尾。 如果 key 不存在,那么它将首先创建一个空字符串的key,再执行追加操作,这种情况 APPEND 将类似于 SET 操作。</remarks>
/// <returns>返回append后字符串值(value)的长度。</returns>
public long StringAppend(string key, string value,int db = -1)
{
return RedisManager.WriteDataBase(db).StringAppend(key, value);
}
调用方法:
[TestMethod]
public void StringAppend()
{
//常规调用方法
var len = _command.StringAppend("myStr", "wuhan", -1);
//命名参数,顺序可变
//可选参数,方法在声明时已经指定了默认值时,可选
len = _command.StringAppend(value: "wuhan", key: "mystr");
Assert.AreEqual(16, len);
}
泛型的协变(Convariant)和抗变/逆变(Contravariant)
协变和抗变:在.NET 4之前,泛型接口是不变的。.NET 4通过协变和抗变为泛型接口和泛型委托添加了一个重要拓展。协变和抗变指对参数和返回值的类型进行转换。
协变:协变类型用out参数标注,支持隐式转换,可以将方法的返回值设置为T,不能把T作为输入参数
抗变:抗变类型用in参数标注,泛型接口就是抗变的,支持强制转换,可以将T作为输入参数,不能将T设置为返回值。
例子:
定义接口:
public interface IEnergy<out T>
{
//协变,支持隐式转换,可以将方法的返回值设置为T,不能把T作为输入参数
T Fun1();
}
public interface IPhysiclalStatus<in T>
{
//抗变,支持强制转换,可以将T作为输入参数,不能把T作为返回值
void Fun1(T obj);
}
动态绑定(Dynamic binding)
Dynamic在ASP.NET MVC的数据绑定中会用到,MVC有两种绑定数据的方法:ViewData与ViewBag,它们有以下区别:
ViewData | ViewBag |
它是Key/Value字典集合 | 它是Dynamic类型对像 |
从Asp.net MVC 1 就有了 | ASP.NET MVC3 才有 |
基于ASP.NET 3.5 | 基于ASP.NET 4.0 |
ViewData比ViewBag快 | ViewBag比ViewData慢 |
在ViewPage中查询数据时需要转换合适的类型 | 在ViewPage中查询数据时不需要类型转换 |
有一些类型转换代码 | 可读性更好 |
说实话,稳妥起见我一般用的还是ViewData,因为我能够很清楚的知道数据会是什么类型,这样能避免犯错。
参考:https://www.cnblogs.com/wintersun/archive/2012/01/21/2328563.html