linq中的分組操作符

分組是根據一個特定的值將序列中的元素進行分組。LINQ隻包含一個分組操作符:GroupBy。GroupBy操作符類似於T-SQL語言中的Group By語句。來看看GroupBy的方法定義:

public static IEnumerable<IGrouping<TKey, TSource>> GroupBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector);
public static IEnumerable<IGrouping<TKey, TSource>> GroupBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, 
IEqualityComparer<TKey> comparer);

從方法定義中可以看出:GroupBy的返回值類型是:IEnumerable<IGrouping<TKey, TSource>>。其元素類型是IGrouping<TKey, TSource>。TKey屬性代表瞭分組時使用的關鍵值,TSource屬性代表瞭分組之後的元素集合。遍歷IGrouping<TKey, TSource>元素可以讀取到每一個TSource類型。看下面的例子:

1、定義Product類,其定義如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace GroupOperation
{
    public class Product
    {
        public int Id { get; set; }
        public int CategoryId { get; set; }
        public string Name { get; set; }
        public double Price { get; set; }
        public DateTime CreateTime { get; set; }
    }
}

2、在Main()方法中調用

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace GroupOperation
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Product> listProduct = new List<Product>()
            {
               new Product(){Id=1,CategoryId=1, Name="C#高級編程第10版", Price=100.67,CreateTime=DateTime.Now},
               new Product(){Id=2,CategoryId=1, Name="Redis開發和運維", Price=69.9,CreateTime=DateTime.Now.AddDays(-19)},
               new Product(){Id=3,CategoryId=2, Name="活著", Price=57,CreateTime=DateTime.Now.AddMonths(-3)},
               new Product(){Id=4,CategoryId=3, Name="高等數學", Price=97,CreateTime=DateTime.Now.AddMonths(-1)},
               new Product(){Id=5,CategoryId=6, Name="國傢寶藏", Price=52.8,CreateTime=DateTime.Now.AddMonths(-1)}
            };

            // 查詢表達式
            var listExpress = from p in listProduct group p by p.CategoryId;
            Console.WriteLine("輸出查詢表達式結果");
            foreach (var item in listExpress)
            {
                Console.WriteLine($"CategoryId:{item.Key}");
                foreach(var p in item)
                {
                    Console.WriteLine($"ProduceName:{p.Name},ProductPrice:{p.Price},PublishTime:{p.CreateTime}");
                }
            }
            Console.WriteLine("***************************************");
            // 查詢方法
            var listFun = listProduct.GroupBy(p => p.CategoryId);
            Console.WriteLine("輸出方法語法結果");
            foreach (var item in listFun)
            {
                Console.WriteLine($"CategoryId:{item.Key}");
                foreach (var p in item)
                {
                    Console.WriteLine($"ProduceName:{p.Name},ProductPrice:{p.Price},PublishTime:{p.CreateTime}");
                }
            }
            Console.ReadKey();
        }
    }
}

結果:

 下面在來看看多個分組條件的例子。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace GroupOperation
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Product> listProduct = new List<Product>()
            {
               new Product(){Id=1,CategoryId=1, Name="C#高級編程第10版", Price=100.67,CreateTime=DateTime.Now},
               new Product(){Id=2,CategoryId=1, Name="Redis開發和運維", Price=69.9,CreateTime=DateTime.Now.AddDays(-19)},
               new Product(){Id=3,CategoryId=2, Name="活著", Price=57,CreateTime=DateTime.Now.AddMonths(-3)},
               new Product(){Id=4,CategoryId=3, Name="高等數學", Price=97,CreateTime=DateTime.Now.AddMonths(-1)},
               new Product(){Id=5,CategoryId=6, Name="國傢寶藏", Price=52.8,CreateTime=DateTime.Now.AddMonths(-1)}
            };

            // 查詢表達式
            var list = from p in listProduct group p by new { p.CategoryId, p.Price };
            Console.WriteLine("查詢表達式方式1輸出:");
            foreach (var item in list)
            {
                Console.WriteLine("key:" + item.Key);
                foreach (var subItem in item)
                {
                    Console.WriteLine($"ProduceName:{subItem.Name},ProductPrice:{subItem.Price},PublishTime:{subItem.CreateTime}");
                }
            }
            var listExpress = from p in listProduct
                              group p by new { p.CategoryId, p.Price } into r  // 使用into把數據填充到局部變量r中,然後select篩選數據
                              select new { key = r.Key, ListGroup = r.ToList() };
            Console.WriteLine("查詢表達式方式2輸出:");
            foreach(var item in listExpress)
            {
                Console.WriteLine("key:"+item.key);
                foreach (var subItem in item.ListGroup)
                {
                    Console.WriteLine($"ProduceName:{subItem.Name},ProductPrice:{subItem.Price},PublishTime:{subItem.CreateTime}");
                }
            }

            // 方法語法
            var listFun = listProduct.GroupBy(p => new { p.CategoryId, p.Price }).Select(g => new { key = g.Key, ListGroup = g.ToList() });
            Console.WriteLine("方法語法輸出:");
            foreach (var item in listFun)
            {
                Console.WriteLine("key:" + item.key);
                foreach (var subItem in item.ListGroup)
                {
                    Console.WriteLine($"ProduceName:{subItem.Name},ProductPrice:{subItem.Price},PublishTime:{subItem.CreateTime}");
                }
            }

            Console.ReadKey();
        }
    }
}

結果:

以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。

推薦閱讀: