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)
可选参数能让我们对一些参数赋予默认值,它的作用类似于方法的重载,同一个方法可以有多个不同的参数。
命名参数最大的特点是我们不必再纠结于参数的顺序了,只要知道参数名,就能准确地调用方法。
例子:
方法的定义
///
/// 追加一个值到key上
///
///
///
/// 如果 key 已经存在,并且值为字符串,那么这个命令会把 value 追加到原来值(value)的结尾。 如果 key 不存在,那么它将首先创建一个空字符串的key,再执行追加操作,这种情况 APPEND 将类似于 SET 操作。
/// 返回append后字符串值(value)的长度。
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
{
//协变,支持隐式转换,可以将方法的返回值设置为T,不能把T作为输入参数
T Fun1();
}
public interface IPhysiclalStatus
{
//抗变,支持强制转换,可以将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