1. 程式人生 > >Linq 基礎和正則表示式

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