LINQ之方法語法

2022-02-14 14:34:38 字數 2735 閱讀 9604

上節講到使用linq的查詢關鍵字進行查詢,這節講一下linq查詢的另一種方式——linq方法。

使用linq方法語法,必須要會用lambda表示式,配合lambda表示式才能體會到linq的優雅便捷。

linq方法是一系列的擴充套件方法,對於實現了ienumerable介面的物件,都可以使用,擴充套件方法在vs智慧型提示中顯示為乙個正方體加乙個向下的虛箭頭。

對於上節的**,使用方法語法則可以簡潔為一行:

int vs = ;

var a = vs.where(v => v > 3);

foreach (var t in

a)

執行結果為:65

使用方法語法的好處是可以直接在原資料後操作,可以使用鏈式程式設計實現複雜的查詢操作。但是一些情況下查詢語法更好用,這個要看開發的需求以及個人喜好。

下面介紹一些常用的linq方法(以下例子基於上述vs陣列):

select

linq方法基本上都要配合lambda表示式,因為linq方法的引數一般都是乙個委託,而lambda表示式在填充委託方面有著優雅的特性(不熟悉lambda表示式用法的同學可以回顧往期文章:**c#中的lambda表示式),表示式引數即是每個遍歷到的資料。select()方法用於隱式迭代所有的資料,可以在迭代中對每個資料進行處理:

var a = vs.select(v => ++v);//

將所有資料加一併返回

selectmany()方法用於返回多行結果,它可以在方法中巢狀查詢。

skip,take

skip(int i)方法用於跳過前i個元素,相反的,take(int i)方法用於獲取前i個元素

var a = vs.skip(2);//

執行結果:325

var a = vs.take(2);//

執行結果:16

skipwhile()和takewhile()用於滿足條件即停止執行,前者返回剩下的元素,後者返回匹配到的元素,個人覺得這兩個方法執行邏輯很繞,有興趣的可以自己寫**看看效果。

skiplast(int i)和tasklast(int i)用於跳過和獲取最後的元素。

concat

concat(ienumerator)用於將引數拼接在原資料的後面。

var a = vs.concat(new list());//

執行結果16325798

contains

contains(t t)用於指定其引數是否包含在該資料來源中。

var a = vs.contains(2);//

true

它還有乙個過載方法 contains(t t,iequalitycomparere),第二個引數用於自定義比較的規則,因為有的時候系統的直接比較法不是我們想要的,所以就需要我們自定義比較規則,這個可以展開來解釋一下:它的第二個引數是乙個介面,介面裡邊定義了乙個equals()方法,我們需要自定義乙個類實現這個介面,請看**:

public

class myclass : iequalitycomparer

//該方法是此介面的另乙個方法,與當前上下文無關,此處不做說明

public

int gethashcode(int

obj)

}var a = vs.contains(2, new myclass());//

false

x就是contains()的第乙個引數,y是迭代資料來源中的每乙個資料,我現在將比較規則改為比較x是否等於y-2,相當於說讓比較2是否包含在中,顯然,結果為false。

一般情況下,自定義規則用在比較自定義物件陣列或集合中。

orderby

orderby()用於排序,根據lambda表示式的返回值進行公升序排序,它有乙個過載,用於自定義排序規則,用法跟contains()類似。

var a = vs.orderby(c => c);//

執行結果 12356

下面我使用它的過載降序排序資料

public

class myclass : iequalitycomparer, icomparer

}

再次呼叫後結果為降序:

var a = vs.orderby(c => c,new myclass());//

執行結果65321

其它

bool all(),

bool any()

前者所有元素滿足即為true,後者至少乙個滿足即為true

int count(),

long longcount()

兩者都是計數,並且可以統計滿足條件元素個數,只是返回值不同

t max(),

​t min()

返回最大最小值,可以自定義排序規則(凡是涉及到比較或排序的,都可以自定義規則)

double sum()

求和t elementat(),

t elementatordefault()

獲取指定位置上的元素,後者對於訪問出錯的情況下返回可以將設定的預設值返回

LINQ查詢語法和方法語法的使用

建立乙個players類 如下 public class players public string team public int position 詳細 如下 static void main string args new players new players new players new...

linq 的查詢語法和靜態擴充套件的方法語法的對比

根據msdn的說明以及大量stackoverflow的說明,結論是 linq的兩者使用沒有區別,效能一致。查詢語法易讀,方法語法在.net clr中全部使用了。查詢語法 query syntax ienumerablenumquery1 from num in numbers where num 2...

詞法 語法 語義

詞法分析階段是編譯過程的第乙個階段,這個階段的任務是對源程式從前到後 從左到右 住個字元的掃瞄,從中識別出乙個個 單詞 符號。單詞 符號是程式語言的基本語法單位,如關鍵字 保留字 識別符號 常數 運算子 分隔符等。詞法分析程式輸出的 單詞 常以二元組的方式輸出,即單詞種別和單詞自身的值。其任務是在詞...