1. 程式人生 > 實用技巧 >linq:求分組後的每組最大值、最小值、平均值等、Aggregate聚合函式

linq:求分組後的每組最大值、最小值、平均值等、Aggregate聚合函式

求分組後的每組最大值、最小值、平均值等

    public int MinEachGroup()
        {
            #region min-each-group
            List<Product> products = GetProductList();

            var categories = from p in products
                             group p by p.Category into g
                             let minPrice 
= g.Min(p => p.UnitPrice) select (Category: g.Key, CheapestProducts: g.Where(p => p.UnitPrice == minPrice)); foreach (var c in categories) { Console.WriteLine($"Category: {c.Category}"); foreach(var p in c.CheapestProducts) { Console.WriteLine($
"\tProduct: {p}"); } } #endregion return 0; }

用法

該Linq字面意思為聚合,例如可用來對集合進行篩選以及上述的求和等等,它有三個過載,它是對列表上的每個元素執行操作,也就是說對第一個和第二個上的元素執行操作,將執行的結果繼續攜帶進行操作。其中有一個過載是種子過載。

我們求1到5的階乘。

            var nums = Enumerable.Range(2, 4);
            var sum = nums.Aggregate(1, (a, b) => a * b);
            Console.WriteLine(sum);

所謂種子,也就是先從種子開始作為第一個元素執行操作,整個過程為((((1*2)*3)*4)*5)。

在專案中有這樣一個場景:開啟對話方塊上傳檔案,可以對該檔案進行命名,但是我們知道檔名是無法以某些特殊字元命名的如<或者|等等,當檔名為這些時,上傳到後臺我們會進行替換處理用“-”來進行替換。我們看看程式碼,例如:

            var invalidFileName = Path.GetInvalidFileNameChars();
            var replaceResult = invalidFileName.Aggregate("study<Aggregate>first", (accmulate, result) => (accmulate.Replace(result, '-')));
            Console.WriteLine(replaceResult);

結果如下: