過濾操作符
Where
運算符(Linq擴展方法)根據給定條件過濾集合。
在其中擴展方法有以下兩個重載。一個過載需要Func <TSource,bool>輸入參數和第二個重載方法需要Func <TSource,int,bool>輸入參數其中int是索引:
查詢語法中的Where子句:
在上面的示例查詢中,lambda表達式主體s.Age > 12 && s.Age < 20
作為謂詞函數傳遞,用於評估集合中的每個學生。Func<TSource, bool>
也可以使用帶有匿名方法的Func類型委托作為謂詞函數進行傳遞
方法中的擴展方法語法:
與查詢語法不同,您需要傳遞整個lambda表達式作為謂詞函數。
Where擴展方法也有第二個重載,包括集合中當前元素的索引。如果需要,您可以在邏輯中使用該索引。
多個Where子句:
OfType
使用OfType運算符根據每個元素的類型過濾上述集合
排序運算符
Orderby
OrderBy按升序或降序對集合的值進行排序。默認情況下,按升序排列集合,因為ascending
關鍵字在這里是可選的。
多重排序:
您可以在由逗號分隔的多個字段上對集合進行排序。給定的集合將首先基於第一個字段進行排序,然后如果第一個字段的值對於兩個元素是相同的,那么它將使用第二個字段進行排序等等。
注:方法語法中的多重排序工作方式不同。使用ThenBy或ThenByDecending擴展方法進行二級排序。
- LINQ包含五個排序算子:OrderBy,OrderByDescending,ThenBy,ThenByDescending和Reverse
- LINQ查詢語法不支持OrderByDescending,ThenBy,ThenByDescending和Reverse。它只支持“升序”和“降序”排序方向的“排序”條款。
- LINQ查詢語法支持用逗號分隔的多個排序字段,而您必須使用ThenBy&ThenByDescending方法進行二級排序。
ThenBy&ThenByDescending
分組操作
Groupby
該組包含在實現了一個IGrouping <TKey,TSource>接口的特殊類型的集合中,其中TKey是一個鍵值,組中已經形成了該組,而TSource是與分組鍵值匹配的元素的集合。
LINQ查詢可以以GroupBy或Select子句結束。 item.Key=by 后面接的數據
ToLookup
ToLookup與GroupBy相同; 唯一的區別是GroupBy執行延遲,而ToLookup執行是立即的。另外,ToLookup僅適用於Method語法。查詢語法不支持ToLookup。
要記住的要點:
- GroupBy&ToLookup返回一個集合,該集合具有一個鍵和一個基於鍵值字段值的內部集合。
- GroupBy的執行被推遲,而ToLookup的執行是立即的。
- LINQ查詢語法可以以GroupBy或Select子句結束。
加入
加入運算符加入兩個序列(集合)並產生結果。
join:
Join操作符運行於兩個集合,即內部集合和外部集合。它返回一個新的集合,其中包含來自滿足指定表達式的集合的元素。它與SQL的內部連接相同。
例如:
Join方法中的第一個參數用於指定內部序列,即standardList。Join方法的第二個和第三個參數用於指定一個字段,其值應該使用lambda表達式進行匹配,以便在結果中包含元素。外部序列的關鍵選擇器student => student.StandardID
指示:將studentList的每個元素的StandardID字段與內部序列的關鍵字匹配standard => standard.StandardID
。如果兩個鍵字段的值匹配,則將該元素包含在結果中。
加入查詢語法:
查詢語法中的連接運算符與方法語法略有不同。它需要外部序列,內部序列,密鑰選擇器和結果選擇器。'on'關鍵字用於關鍵選擇器,其中'equals'運算符的左側是outerKeySelector,'equals'的右側是innerKeySelector。
要記住的要點:
- Join 就像SQL的內部連接一樣。它返回一個新的集合,其中包含兩個集合中的通用元素,這兩個集合的密鑰匹
- 連接操作兩個序列的內部序列和外部序列,並產生一個結果序列。
- 加入查詢語法:
from... in outerSequence
join... in innerSequence
on outerKey equals innerKey
select ...
GroupJoin
方法查詢:
查詢語法:
投影運算符:Select,SelectMany
select
返回一個包含基於轉換函數的元素的IEnumerable集合。它類似於生成平坦結果集的SQL的Select子句。
LINQ查詢語法必須以Select或GroupBy子句結束。以下示例演示select運算符,該運算符返回StudentName的字符串集合。
SelectMany:
SelectMany運算符投影基於轉換函數的值序列,然后將它們平鋪為一個序列。
量詞運算符
All
All運算符在指定的條件下評估給定集合中的每個元素,如果所有元素滿足條件,則返回True。
Any
查元素是否滿足給定的條件,如果有一個滿足就返回真。
Contains
檢查集合中是否存在指定的元素,並返回布爾值。
即使studentList中存在“Bill”,Contains也會返回false。這是因為Contains擴展方法只比較對象的引用,而不是對象的實際值。因此,要比較學生對象的值,您需要通過實現IEqualityComparer接口創建一個類,該接口比較兩個Student對象的值並返回布爾值。
聚合運算符
Aggregate
執行累積操作。這個跟JavaScript里面的reduce函數一樣。
Average
平均擴展方法計算集合中數值項的平均值。平均方法返回可為空或不可空的十進制,雙精度或浮點值。
Count
Count運算符返回集合中元素的數量或滿足給定條件的元素數量。
Max
Max運算符返回集合中最大的數字元素。
Sum
計算集合中數字項目的總和。
元素操作符 :從一個序列(集合)中返回一個特定的元素
ElementAt & ElementAtOrDefault
ElementAt: 法返回給定集合中指定索引的元素。如果指定的索引超出集合的范圍,則會拋出索引超出范圍的異
ElementAtOrDefault: 如果指定的索引超出了集合的范圍,那么它將返回數據類型的默認值而不是拋出錯誤。
First & FirstOrDefault
返回集合中第零個索引的元素,即第一個元素。此外,它返回一個滿足指定條件的元素
Last & LastOrDefault
返回集合中的最后一個元素.跟First&FirstOrDefault剛好是相反的。
Single & SingleOrDefault
返回集合中唯一的元素,如果找不到元素或存在多個元素都會報錯。
SingleOrDefault如果集合為空,或者找不到指定條件的元素,它將返回集合的數據類型的默認值。
- Single()期望集合中只有一個元素。
- Single()在集合中沒有元素或多個元素時拋出異常。
- 如果在Single()中指定了一個條件,並且結果不包含任何元素或多個元素,則會引發異常。
- SingleOrDefault()將返回一個泛型集合的數據類型的默認值,如果聚集中沒有元素或指定的條件。
- 如果聚集中有多個元素或指定的條件,SingleOrDefault()將會拋出一個異常。
平等運算符
SequenceEqual
SequenceEqual方法檢查元素的數量,每個元素的值和兩個集合中元素的順序是否相等。
Concat
附加兩個相同類型的序列並返回一個新的序列(集合)。
生成操作符 LINQ包含了生成運算符DefaultIfEmpty,Empty,Range&Repeat。Empty,Range和Repeat方法不是IEnumerable或IQueryable的擴展方法,但它們只是靜態類Enumerable中定義的靜態方法。
DefaultIfEmpty
如果調用DefaultIfEmpty()的給定集合為空,則DefaultIfEmpty()方法將返回具有默認值的新集合。
DefaultIfEmpty()的另一個重載方法需要一個應該被默認值替換的值參數。
Empty
返回一個空的集合。
Empty()方法不像其他LINQ方法那樣是IEnumerable或IQueryable的擴展方法。這是Enumerable靜態類中包含的靜態方法。所以,你可以像Enumerable.Empty <TResult>()這樣的其他靜態方法調用它。Empty()方法返回一個指定類型的空集合
Range
從第一個元素開始返回一個IEnumerable <T>類型的集合,其中包含指定數量的元素和順序值。
Repeat
生成一個具有指定數量元素的IEnumerable <T>類型的集合,每個元素包含相同的指定值。
設置運算符
Distinct
不同的擴展方法返回給定集合中唯一元素的新集合。
Except
需要兩個集合。它返回一個新集合,其中第一個集合中的元素不存在於第二個集合(參數集合)中。
復雜的類型跟上門一樣。
Intersect
需要兩個集合。它返回一個新的集合,其中包含集合中存在的公共元素。
Union
需要兩個集合,並返回一個新集合,其中包含兩個集合中不同的元素。
分區操作符
Skip & SkipWhile
從第一個元素開始跳過指定數量的元素,並返回其余元素.
LINQ中的SkipWhile()擴展方法跳過集合中的元素,直到指定的條件為真。它返回一個新的集合,包含所有剩余的元素,一旦指定的條件為任何元素為false。
Take & TakeWhile
返回從第一個元素開始的指定數量的元素。
TakeWhile()擴展方法返回給定集合中的元素,直到指定的條件為真。如果第一個元素本身不滿足條件,則返回一個空集合。
在上面的例子中,TakeWhile()只包含第一個元素,因為第二個字符串元素不滿足條件。
注:把Skip和Take聯合起來就可以形成分頁。
轉換運算符
AsEnumerable & AsQueryable
AsEnumerable和AsQueryable方法將源對象強制轉換或分別轉換為IEnumerable <T>或IQueryable <T>。
Cast與AsEnumerable <T>完全相同。它將源對象轉換為IEnumerable <T>。
ToArray:ToArray(),ToList(),ToDictionary():
ToArray(),ToList(),ToDictionary()方法分別將源對象轉換為數組,List或Dictionary。
附加:
Let 關鍵字
“let”關鍵字在查詢語法中很有用。它會投影一個新的范圍變量,允許重新使用表達式並使查詢更具可讀性。
例如: 這里需要寫,兩遍 let可以看成在查詢語法里面申明一個變量。
Into 關鍵字
分組里面也可以使用Into關鍵字