日期:2014-05-20  浏览次数:20833 次

简单的linq和正则表达式

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。大写就是