C# 中的LINQ 提供了兩種操作方式,查詢運算式和查詢運算子,所有的查詢運算式都有對應的查運算子類替代,查詢運算式有點“類” SQL,在代碼中寫SQL,總覺得不夠“優雅”,使用查詢運算子就顯得“優雅”很多, 本系列就來對所有的LINQ 標準運算子進行一個全面的總結,這些運算子和我上篇文章總結的RxJS運算子有很多相似之處,甚至想通之處,有興趣的可以點擊鏈接查看,從整體來看C# 的LINQ 運算子分為13類,分別為聚合,轉換,元素操作,相等操作,生成,分組,連接(join),分部,投影,數量,過濾,基于集的運算子,排序,熟練掌握LINQ對寫代碼的效率有很大的提高,可以說LINQ ,lambda和泛型已經變成C# 語言的基石,如果沒有這三個特性下代碼將會變得多么的無趣,
聚合運算子
聚合操作的所有回傳值都只是一個值,
為了演示這里我們定義兩個陣列,一個表示字串的陣列textSource和一個表示int 型別的 numberSource陣列:
static string[] textSource = { "zero", "one", "two", "three","four","five","six","seven","eight","nine" }; static int[] numberSource = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
1.Sum 針對內置數值型別或者通過使用委托從元素內部轉換為內部數值型別元素的序列進行求和,如:
//對int型別的序列進行直接累加求和 Console.WriteLine(numberSource.Sum()); //45 //對int型別的序列中的每個元素進行平方后進行累加求和 Console.WriteLine(numberSource.Sum(s =>s*s));//285 //對字串陣列中的每一個字串的長度進行累加求和 Console.WriteLine(textSource.Sum(s=>s.Length));//40
2.Average 針對內置數值型別或者通過使用委托從元素內部轉換為內部數值型別元素的序列進行求平均數, 如:
//對int型別的序列進行直接求平均數 Console.WriteLine(numberSource.Average()); //4.5 //對int型別的序列中的每個元素進行平方后進行求平均數 Console.WriteLine(numberSource.Average(s => s * s));//28.5 //對字串陣列中的每一個字串的長度進行求平均數 Console.WriteLine(textSource.Average(s => s.Length));//4
3.Count & LongCount 兩個運算子作用都是求集合中元素的個數,僅僅是回傳的型別不同,Count 回傳int 型別, LongCount 回傳 long 型別,如:
//求陣列中的元素數量 Console.WriteLine(numberSource.Count()); //10 //求陣列中元素小于6的元素的數量 Console.WriteLine(numberSource.Count(s => s<6));//6 //求字串長度大于4的元素的數量 Console.WriteLine(textSource.Count(s => s.Length>4));//3 //求陣列中的元素數量 Console.WriteLine(numberSource.LongCount()); //10 //求陣列中元素小于6的元素的數量 Console.WriteLine(numberSource.LongCount(s => s < 6));//6 //求字串長度大于4的元素的數量 Console.WriteLine(textSource.LongCount(s => s.Length > 4));//3
4. Min & Max 兩個運算子計算集合中最大或最小值,并且可以傳入委托對結果進行處理,如:
//求int 陣列中的元素的最小值 Console.WriteLine(numberSource.Min()); //0 //求int陣列中元素的最小值并和1進行比較 Console.WriteLine(numberSource.Min(s => s > 1));//False //求字串陣列中最短字串的長度 Console.WriteLine(textSource.Min(s=>s.Length));//3 //求int 陣列中的元素的最大值 Console.WriteLine(numberSource.Max()); //9 //求int陣列中元素的最大值并和1進行比較 Console.WriteLine(numberSource.Max(s => s > 1));//True //求字串陣列中最長字串的長度 Console.WriteLine(textSource.Max(s => s.Length));//5
5.Aggregate 這個運算子是非常靈活的一個運算子,所有的聚合運算子都可以用這個運算子來替代, 這個運算子還可以將結果通過委托轉換成其它型別,使用非常廣泛,下面我將使用Aggregate 運算子對上面講到的運算子進行等價操作,
//對int型別的序列進行直接累加求和 var sum = numberSource.Aggregate((current, item) => current + item); Console.WriteLine(sum);//45 //對int型別的序列中的每個元素進行平方后進行累加求和 Console.WriteLine(numberSource.Aggregate((current, item) => current + item * item));//285 //對字串陣列中的每一個字串的長度進行累加求和 Console.WriteLine(textSource.Aggregate(0, (current, item) => current + item.Length));//40 //對int型別的序列進行直接求平均數 Console.WriteLine(numberSource.Aggregate(0, (current, item) => current + item, result => (float)result / numberSource.Length)); //4.5 //對int型別的序列中的每個元素進行平方后進行求平均數 Console.WriteLine(numberSource.Aggregate(0, (current, item) => current + item * item, result => (float)result / numberSource.Length));//28.5 //對字串陣列中的每一個字串的長度進行求平均數 Console.WriteLine(textSource.Aggregate(0, (current, item) => current + item.Length, result => (float)result / numberSource.Length));//4 //求陣列中的元素數量 Console.WriteLine(numberSource.Aggregate(0, (current, item) => current + 1)); //10 //求陣列中元素小于6的元素的數量 Console.WriteLine(numberSource.Aggregate(0, (current, item) => item < 6 ? (current + 1) : current));//6 //求字串長度大于4的元素的數量 Console.WriteLine(textSource.Aggregate(0, (current, item) => item.Length > 4 ? (current + 1) : current));//3 //求int 陣列中的元素的最小值 Console.WriteLine(numberSource.Aggregate(0, (current, item) => item <current ? current=item : current)); //0 //求int陣列中元素的最小值并和1進行比較 Console.WriteLine(numberSource.Aggregate(0, (current, item) => item < current ? current = item : current,resut=>resut>1));//False //求字串陣列中最短字串的長度 Console.WriteLine(textSource.Aggregate(10, (current, item) => item.Length < current ? current = item.Length : current));//3 //求int 陣列中的元素的最大值 Console.WriteLine(numberSource.Aggregate(0, (current, item) => item > current ? current = item : current)); //9 //求int陣列中元素的最大值并和1進行比較 Console.WriteLine(numberSource.Aggregate(0, (current, item) => item > current ? current = item : current, resut => resut > 1));//True //求字串陣列中最長字串的長度 Console.WriteLine(textSource.Aggregate(0, (current, item) => item.Length > current ? current = item.Length : current));//5 //在100 的基礎上對numberSource的每一項進行求和 var sumWithSeed = numberSource.Aggregate(100, (current, item) => current + item); Console.WriteLine(sumWithSeed);//145 //在100 的基礎上對numberSource的每一項進行求和,并對結果進行平方 var sumWithSeedAndResultSquare = numberSource.Aggregate(100, (current, item) => current + item, result => result * result); Console.WriteLine(sumWithSeedAndResultSquare);//21025 //在100 的基礎上對numberSource的每一項進行平方后求和,并對結果進行開平方根 var sumWithSeedItemSquareAndResultSqrt = numberSource.Aggregate(100, (current, item) => current + item * item, result => Math.Sqrt(result)); Console.WriteLine(sumWithSeedItemSquareAndResultSqrt);//19.621416870348583 //字串拼接 var concatArray = textSource.Aggregate((current, item) => current + "," + item); Console.WriteLine(concatArray);//zero,one,two,three,four,five,six,seven,eight,nine //拼接字串病帶有每個字符的長度 var concatArrayWithLength = textSource.Aggregate("",(current, item) => current + "," + item+":"+item.Length,resut=>resut.TrimStart(',')); Console.WriteLine(concatArrayWithLength);//zero:4,one:3,two:3,three:5,four:4,five:4,six:3,seven:5,eight:5,nine:4
所有的其他聚合運算子都能表示 為對Aggregate的呼叫,雖然這樣做會相對繁瑣,其基本思想就是,總是存在以初始元素開頭的 “當前結果”,聚合委托被應用于輸入序列的每個元素;委托取得當前結果和輸入元素,并生成下 一個結果,作為最終可選步驟,轉換被應用于聚合結果上,并將其轉換為這個方法的回傳值,如 果有必要,這種轉換可以產生不同的資料型別,
聚合運算子非常簡單,這些運算子都是立即執行的,只要代碼被呼叫就會立即 回傳結果,
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/26975.html
標籤:C#
上一篇:關于二叉樹的一些基本知識
