1、.Net Framework提供给我们灵活强大的数据操控能力。比如说,当我们需要对数据进行筛选的时候,我们想到的是“Where”子句,而不是List<T>.FindAll();当我们需要对数据进行排序的时候,我们想到的是“Order By”子句,而不是List<T>.Sort();当我们需要对数据进行分页的时候我们想到的是存储过程,而不是List<T>.GetRange()。
2、Lambda 表达式是一种匿名函数结构,它可以方便的实现委托、查询综合和扩展方法的 delegate 类型参数的初始化定义。
形式:
( 形参列表 ) => { 函数体 }
可以没有参数列表,如:
() => { Console.WriteLine(""); }
3、扩展方法将一个在特定类型上实现的方法引入到该类型上,并可利用该类型直接调用。
例如,Count() 方法可以计算元素的个数,Count() 方法可以实现在 string、数组、集合、IEnumerable< T> 上,甚至是上文中定义的 Persons 类上。为了在 string 上实现 Count(),可以使用如下代码。
using System.Runtime.CompilerServices;
public class Extensions
{
[Extension()]
public int Count(this string source)
{
int count = 0;
foreach (var item in source)
{
count++;
}
return count;
}
[Extension()]
public int Count<T>(this IEnumerable<T> source) {
int count = 0;
foreach (var item in source) {
count++;
}
return count;
}
}
这样,就在 IEnumerable<T> 上和 string 上都实现了Count()方法。我们可以象使用IEnumerable<T> 和 string 上的成员方法一样使用扩展方法,例如:
string s = "Hello, World!";
int c1 = s.Count();
List< int> list = new List<int>() { 1, 2, 3, 4, 5, 6 };
int c2 = list.Count();
4、匿名类型常常用在查询表达式的结果中,因为这种类型的返回值往往是一个包含一种特定类型的 IEnumerable< T>。例如,要从上面的例子中选出年龄大于 21 岁,身高大于 160 厘米的 Person 集合,可以采用如下形式。
var result = from person in persons where person.Age >= 21 && person.Height >= 160
select new { Name = person.Name, Age = person.Age, Height = person.Height / 100 };
new { Name = person.Name, Age = person.Age, Height = person.Height / 100 } 是一个匿名类型,编译器将对它做如下声明。
public class _Anonymous_Name_Age_Height {
public string Name;
public string Age;
public decimal Height;
}
5、委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。使用委托可以将多个方法绑定到同一个委托变量,当调用此变量时(这里用“调用”这个词,是因为此变量代表一个方法),可以依次调用所有绑定的方法。