Linq一共包含五十幾個查詢運算符,常用的根據類型來區分一共有5類左右,這五類裡面一些事在項目查詢中經常用到的。不過linq運算符的命名十分規範,基本從字面意思就能猜測出來是幹嘛用的,下麵我們挑選一些常用的來介紹一下。根據分類我們能分成下麵4種類型:1.返回IEnumerable類型的 1.1...
Linq一共包含五十幾個查詢運算符,常用的根據類型來區分一共有5類左右,這五類裡面一些事在項目查詢中經常用到的。不過linq運算符的命名十分規範,基本從字面意思就能猜測出來是幹嘛用的,下麵我們挑選一些常用的來介紹一下。根據分類我們能分成下麵4種類型:
1.返回IEnumerable<T>類型的
1.1 Where:主要用於對於序列的篩選,跟在sql中對數據篩選用法是一樣的
1 int[] array = { 1, 3, 5, 7, 2 }; 2 var query = array.Where(p => p >= 2); //輸出 3,5,7,2
1.2 OfType:這個也用於篩選數據,跟where不同之處在於是對某一類型的數據篩選,根據指定類型對IEnumerable元素的篩選
1 List<object> list = new List<object>(); 2 list.Add("Power"); 3 list.Add(1); 4 list.Add(DateTime.Now); 5 var query = list.OfType<string>().Where(p => p.StartsWith("P")); //輸出 Power
1.3 Cast:定義在IEnumerable上,用於將非泛型的序列轉成泛型序列,當轉換不成功的時候,則會拋出異常
1 ArrayList al = new ArrayList(); 2 al.Add(100); 3 al.Add(200); 4 al.Add("df"); //拋出System.InvalidCastException異常
1.4 OrderBy,ThenBy,OrderByDescending,ThenByDescending:這幾個就是排序,排序,排序。唯一要註意的事情是ThenBy是在IOrderedEnumerable<T>上面定義的拓展方法,因為不能直接在IEnumerable<T>上調用,ThenBy的調用只能排在OrderBy之後
1 List<Product> list2 = new List<Product>(); 2 list2.Add(new Product() {Index = 1,value = 2}); 3 list2.Add(new Product() { Index = 12 value = 22 }); 4 list2.OrderBy(p => p.Index).ThenBy(p => p.value);
1.5 Select:實現了投影操作,可以在其內對對象類型進行轉換。例如在select出來的對象中,將其轉換成我們所需要的類型
1 list2.Select(p=>new Product {Index = p.Index});//新建了一個product對象
1.6 Take,Skip:skip是跳過幾個元素,take是取幾個元素,這兩個東西用於分頁,例如我們想跳過前面十行的數據,取後面十行的數據
1 var q = list.Skip(10).Take(10);
1.7 TakeWhile(),SkipWhile():
TakeWhile在遇到不符合條件的元素的時候返回前面找到符合條件的元素
1 int[] arr = {1, 4, 8, 2, 3,1}; 2 var query1 = arr.TakeWhile(x => x <= 3); //輸出 1
SkipWhile會一直跳過符合條件的元素,直到遇到第一個不符合條件的元素,然後取該元素後面的所有元素
1 var query2 = arr.SkipWhile(x => x <= 3);//輸出 4 8 2 3 1
1.8 Reverse()用於將序列中的元素逆序排列
1.9 DefaultIfEmpty()當序列為空的時候,DefaultIfEmpty會添加一個預設值或者指定值,這個在做left join或right join中比較好用,當為空值的時候,我們可以指定他的值
1 int[] arr = {}; 2 var query2 = arr.DefaultIfEmpty();//輸出 0
1.10 Distinct()主要用於去重覆序列
1 int[] arr = {1, 2, 3, 3}; 2 var query2 = arr.Distinct(); 3 query2.ToList().ForEach(p=> Console.Write(p));//輸出 1 2 3
Int類型能夠實現去重覆的原因是Int類型繼承了IComparable,當假如我們想對一個類的一個欄位進行去重覆,我們可以調用Distinct的一個重載方法,傳遞繼承於IEqualityComparer<T>的Class
1 public class ProductComparer:IEqualityComparer<Product> 2 { 3 public bool Equals(Product a, Product b) 4 { 5 return a.Index == b.Index; 6 } 7 8 public int GetHashCode(Product obj) 9 { 10 return obj.Index; 11 } 12 } 13 14 public class Product 15 { 16 public int Index { get; set; } 17 } 18 19 20 21 Product[] array = new[]{ 23 new Product() {Index = 1}, 24 new Product() {Index = 2}, 25 new Product() {Index = 2}, 26 new Product() {Index = 3} 27 }; 28 29 30 ProductComparer pc = new ProductComparer(); 31 var query2 = array.Distinct(pc); //輸出 1 2 3
1.11 GroupBy:在SQL中,group by只能跟聚合函數一起搭配使用,但在linq中,groupby出來的東西可以是一個樹形結構
1 List<Product> list = new List<Product>() 2 { 3 new Product() {Index = 1,Value = 1}, 4 new Product() {Index = 2,Value = 2}, 5 new Product() {Index = 2,Value = 3}, 6 new Product() {Index = 3,Value = 3}, 7 new Product() {Index = 4,Value = 5}, 8 }; 9 10 var query2 = list.GroupBy(p => p.Index).ToList(); 11 12 foreach (var item in query2) 13 { 14 Console.Write(item.Key+"-"); 15 foreach (var product in item) 16 { 17 Console.Write(product.Value); 18 Console.WriteLine( ); 19 } 20 } //輸出 1-1 2-2 3 3-3 4-5
1.12 Intersect(),Except():Intersect是返回兩個序列中相同元素構成的序列,Except則相反
1 int[] arr1 = {1, 2, 3}; 2 int[] arr2 = { 2, 5, 6 }; 3 var query2 = arr1.Intersect(arr2); //輸出 2
1.13 Concat(),Union():concat用於連接兩個序列,union也是連接兩個序列,但是會剔除相同的項目
1.14 Zip():將兩個序列中index相同的元素,組成一個新的元素,長度以短的為準
1 int[] arr = {1, 2, 3, 4}; 2 string[] arr2 = {"一", "二", "三", "四", "五"}; 3 var query = arr.Zip(arr2, (x, y) => string.Format("{0},{1}", x, y)); 4 //輸出 1,一 2,二 3,三 4,四
2.返回其他序列類型
ToArray,ToList,ToDictionary,ToLookUp這幾個都是將IEnumerable<T>轉換成相應類型,就跟平常Tolist一樣,沒有延遲載入,立即返回。
3.返回序列中的元素
3.1 ElementAt(),ElementAtOrDefault():ElementAt(index)返回下標值為index的元素,不存在的話拋出異常,用ElementAtOrDefault這個返回該類型的預設值來解決異常情況
3.2 First(),FirstOrDefault():First 返回滿足條件的第一個序列元素,不存在的話拋出異常,用FirstOrDefault這個返回該類型的預設值來解決異常情況
3.3 Last(),LastOrDefault():Last返回滿足條件的最後一個序列元素,不存在的話拋出異常,用LastOrDefault這個返回該類型的預設值來解決異常情況
3.4 Single(),SingleOrDefault():Single跟上面幾個有點不一樣的地方,它要求序列中有且僅有一個滿足條件的項,當大於一項的時候,會拋出異常。SingleOrDefault用於當查詢結果為0項時,返回類型預設值。
4.返回標量值
4.1 Count(),LongCount(),Max(),Min(),Average(),Sum():這幾個估計大家都非常熟悉了,憑藉字面意思就能知道大概了,我們直接來看例子:
1 int[] arr = {1, 2, 3, 4}; 2 int query1 = arr.Count(); 3 Console.WriteLine(query1); //輸出 4 4 5 int query2 = arr.Max(); 6 Console.WriteLine(query2);//輸出 4 7 8 int query3 = arr.Min(); 9 Console.WriteLine(query3); //輸出 1 10 11 double query4 = arr.Average(); 12 Console.WriteLine(query4); //輸出 2.5 13 14 int sum = arr.Sum(); 15 Console.WriteLine(sum);//輸出 10
4.2 Aggregate():返回自定義的聚合,例如每個元素乘2,再相加
1 int sum2 = arr.Aggregate(0, (total, x) => total + (x*2)); 2 Console.WriteLine( sum2);//輸出20
4.3 Contains(),Any(),All(),SequenceEqual()
Contains:判斷某一元素是否在存在序列中
Any:判斷序列中是否存在滿足表達式的元素,只要有一個元素滿足,返回True。我們經常會判斷某一list不為空時,用list.count!=0,這樣是比較浪費性能因為會去統計該list全部個數,當我們用any的時候,只要判斷第一個元素即可
All:判斷序列中是否全部元素都滿足表達式,只要一個不滿足,則返回fasle
SequenceEqual:用於逐項比較兩個序列,當兩個序列中元素數目相同,並且元素位置一樣,則返回true,否則false
完結
感謝大家觀看,祝大家2016年快樂!