Linq 基础
语法:
在c#中的var是一个类型的简写,是根据右边进行类型的推导,只是编译器自动帮我们编译成右边的类型
Object 和var 的区别
Object 是一个类型
var还可以是匿名类型
匿名类型
Var p=new {Age=5,Name=”tom”};//p是匿名类型的对象
var 专门为匿名而生的
反编译后发现是只读的类型
Get方法
匿名类型的重用,如果成员的类型一样的话
那么会重用
Select 就是可以附加一下信息帅选出来
Where 是选出符合条件的信息
Orderby 排序
基于类型推断的考虑。所以Select 在最后
From在最前,这就是为什么和sql有点相反的原因
var e1 = from i in values
where i > 0
orderby i descending
select "[" + i + "]";
泛型委托
E1是什么类型取决于你的还回的是什么类型了
Let 是个申明临时变量在linq中
Linq 最终编译成委托类型,可以调用.net函数
匿名对象的学习总结
//var e2 = values.Except(values1);
var e2 = values.Intersect(values1);
values。Single();判断集合中有且只有一条信息
linq只能用于泛型的系列对于非泛型的
可以用Cast<int>
对于非范型,可以用Cast或者OfType转换成泛型
Cast用来将非泛型的系列转换成泛型的系列
Values.cast<int>
Oftype <int>是将是int 类型的转换成系列
挑着转换
Oftype是挑出符合类型的转换
下面的方法都是IEnumerable<T>的扩展方法:
Average计算平均值; Min最小元素;Max最大元素;Sum元素总和; Count元素数量;
Concat连接两个序列;//Unoin all
Contains序列是否包含指定元素;
Distinct取得序列中的非重复元素;
Except获得两个序列的差集;
Intersect获得两个序列的交集;
First取得序列第一个元素;
Single取得序列的唯一一个元素,如果元素个数不是1个,则报错;!!!严谨的程序。
FirstOrDefault 取得序列第一个元素,如果没有一个元素,则返回默认值;
Linq只能用于范型的序列,IEnumerable<T>,对于非范型,可以用Cast或者OfType
IEnumerable的方法:
Cast<TResult>:由于Linq要针对范型类型操作,对于老版本.Net类等非范型的IEnumerable序列可以用Cast方法转换为范型的序列。ArrayList l; IEnumerable<int> il = l.Cast<int>();
OfType<TResult>:Cast会尝试将序列中所有元素都转换为TResult类型,如果待转换的非范型序列中含有其他类型,则会报错。OfType则是只将序列中挑出指定类型的元素转换到范型序列中。
Linq的效率怎么样(小数据量、对性能要求不高的环节用linq很方便,而且延迟加载机制降低了内存占用,比一般人写的程序效率都高)
正则表达式
- 正则表达式是用来进行文本处理的技术,是语言无关的,在几乎所有语言中都有实现。javascript也会用到。
- 一个正则表达式就是由普通字符以及特殊字符(称为元字符)组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。
- 就像通配符“*.jpg”、“%ab%”,它是对字符串进行匹配的特殊字符串
- 正则表达式是非常复杂的,不要希望一次都掌握,理解正则表达式能做什么(字符串的匹配、字符串的提取、字符串的替换),掌握常用的正则表达式用法,以后用到再查就行。
- 找工作的亮点。后面项目中的采集器、敏感词过滤、URLRewite、Validator也会涉及到正则表达式。
元字符
- .:匹配任何单个字符。例如正则表达式“b.g”能匹配如下字符串:“big”、“bug”、“b g”,但是不匹配“buug”,“b..g”可以匹配“buug”。
- [ ] :匹配括号中的任何一个字符。例如正则表达式“b[aui]g”匹配bug、big和bag,但是不匹配beg、baug。可以在括号中使用连字符“-”来指定字符的区间来简化表示,例如正则表达式[0-9]可以匹配任何数字字符,这样正则表达式“a[0-9]c”等价于“a[0123456789]c”就可以匹配“a0c”、“a1c”、“a2c”等字符串;还可以制定多个区间,例如“[A-Za-z]”可以匹配任何大小写字母,“[A-Za-z0-9]”可以匹配任何的大小写字母或者数字。
- ( ) :将 () 之间括起来的表达式定义为“组”(group),并且将匹配这个表达式的字符保存到一个临时区域,这个元字符在字符串提取的时候非常有用。把一些字符表示为一个整体。改变优先级、定义提取组两个作用。
- | :将两个匹配条件进行逻辑“或”运算。'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。
- *:匹配0至多个在它之前的子表达式,和通配符*没关系。例如正则表达式“zo*”能匹配 “z” 、“zo”以及 “zoo”;因此“.*”意味着能够匹配任意字符串。"z(b|c)*"→zb、zbc、zcb、zccc、zbbbccc。"z(ab)*"能匹配z、zab、zabab(用括号改变优先级)。
- + :匹配前面的子表达式一次或多次,和*对比(0到多次)。例如正则表达式9+匹配9、99、999等。 “zo+”能匹配 “zo”以及 “zoo” ,不能匹配"z"。
- ? :匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 。一般用来匹配“可选部分”。
- {n} :匹配确定的 n 次。"zo{2}"→zoo。例如,“e{2}” 不能匹配“bed”中的“e”,但是能匹配“seed”中的两个“e”。
- {n,} :至少匹配n次。例如,“e{2,}”不能匹配“bed”中的“e”,但能匹配 “seeeeeeeed”中的所有“e”。
- {n,m} :最少匹配 n 次且最多匹配 m 次。“e{1,3}”将匹配“seeeeeeeed”中的前三个“e”。
{}匹配的次数
[]匹配的范围
+匹配前面的一到多次
^匹配开始还表示非的意思
$匹配行的结束
- 正则表达式是与语言无关真的就是想表达\d。
- 注意这些简写表达式是不考虑转义符的,这里的\就表示字符\,而不是C#字符串级别的\,在C#代码中需要使用@或者\双重转义。区分C#级别的转移和正则表达式级别的转移,恰好C#的转义符和正则表达式的转义符都是\而已。正则表达式的转移是在C#之后的(层层盘剥)。把C#的转义符想成%就明白了。在C#看来@"\-"就是\-这个普通的字符串,只不过在正则表达式分析引擎看来他有了特殊含义。"\\d"或者@"\d"
– \d:代表一个数字,等同于[0-9]
– \D:代表非数字,等同于[^0-9]
– \s:代表换行符、Tab制表符等空白字符
– \S:代表非空白字符
– \w:匹配字母或数字或下划线或汉字,即能组成单词的字符
– \W:非\w ,等同于[^\w]
d:digital;s:space、w:word。大写就是“非”