1、Linq概念
就一查询表达式,其他可以查MSDN
2、类型推断和var关键词
代码如下:
var i = 15;
int sum = i + 30;
代码理解说明:那么变量i由CLR去推断他的类型,var关键词并不是某种特别类型的符号,它是句语法上的速记,表示任何可以从初始化的右边推断出的类型。在上个声明中,它就是int的速记。
使用var关键字有一些重要的条件
1.只能用于本地变量,不能用于字段
2.只能在变量声明中包含初始化时使用
C#与Javascript中的var的区别
js中的var他是一种类型(js是弱类型语言),还c#则是相当一样速记(媒介)来使用,这不改变C#的强类型性质。
3、序列化与元素的概念
Linq最基本的数据单元是序列(sequences)和元素(element),一个序列是实现了IEnumerable<T>的对象,一个序列包含N过元素(element),如下代码names则代表一个可查询的序列,其中的“Rock”,“Alice”,”Tome”则是每一个元素。
string[] names ={ "Rock","Alice","Tom"};
var filterNames = names.Where(p => p.Length >= 4);
foreach (var name in filterNames)
{
Console.WriteLine(name);
}
4、扩展方法
语法如下:
/// <summary>
/// 判断所有元素都包含指定字符
/// </summary>
/// <param name="list">序列</param>
/// <param name="fraction">字符</param>
/// <returns></returns>
public static bool PassString(this IEnumerable list, string fraction)
{
foreach (var item in list)
{
if (!item.ToString().Contains(fraction))
return false;
}
return true;
}
扩展方法解决了我们不能为编译好的新增方法的烦劳。
扩展方法重要需要如下:
1、必须是静态方法
2、必须发展静态类中
3、方法的第一个关键字必须用this关键词,第二this之后必须指定扩展类的名称。
5、查询语法与方法语法(Linq的呈现形式)
//Linq的呈现形式
int[] numbers = { 10,5,20,32,69,33,9};
var filterNumbers_select = from number in numbers //查询语法
where number > 20
select number;
var filterNumbers_method = numbers.Where(number => number > 20);//方法语法(此处的Where就是一个扩展方法)
var filerNumbers_select_method_count = (from number in numbers//两种形式的组合
where number > 20
select number).Count();
说明:此处filterNumbers_select ,filterNumbers_method ,filerNumbers_select_method 叫查询变量,理解查询变量的内容很重要,在执行以上代码后,filterNumbers_select ,filterNumbers_method不会包含查询结果,他包含的是IEnumerable<int>类型的对象,查询变量filerNumbers_select_method_count
包含的则是真实的查询结果(整数类型),这个结果只能通过真实运行后才能获得。
区别在于查询的执行时间,可以总结如下:
如果查询表达式返回枚举,查询直到处理枚举时才真正执行查询这个动作,如果枚举对象被用上多次,则执行查询的这个动作也会被处理多次。
如果查询表达式返回标量,查询则立马执行,并把查询结果保存到查询变量中。