LINQ中分组操作符(十)
分组是根据一个特定的值将序列中的元素进行分组。LINQ只包含一个分组操作符:GroupBy。GroupBy操作符类似于T-SQL语言中的Group By语句
一、单一条件分组
Sample Code:
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; } } 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(); } } }
二、多条件分组
Sample Code:
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; } } 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=100.67, 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}"); } } Console.WriteLine("************************************************************"); 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}"); } } Console.WriteLine("************************************************************"); // 方法语法 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(); } } }