lambda GroupBy

标准用法

public class Student
{
    public string Name { get; set; }

    public bool Graduation { get; set; }

    public int Age { get; set; }

    public int Score { get; set; }

    public string City { get; set; }

    public override string ToString()
    {
        return $"姓名:{Name},年龄:{Age},分数:{Score},是否毕业:{Graduation},城市:{City}";
    }
}

class Program
{
    static void Main(string[] args)
    {
        var students = new List<Student>
        {
            new Student{Name = "张三",Age = 15,Score = 94,Graduation = true,City = "北京"},
            new Student{Name = "李四",Age = 17,Score = 47,Graduation = false,City = "北京"},
            new Student{Name = "王二",Age = 19,Score = 77,Graduation = false,City = "广州"},
            new Student{Name = "孙五",Age = 14,Score = 14,Graduation = false,City = "上海"}
        };

        var groupByResult = students.GroupBy(x => x.City);
        foreach (var item in groupByResult)
        {
            Console.WriteLine($"分组城市:{item.Key}");
            foreach (var student in item)
            {
                Console.WriteLine(student.ToString());
            }
        }
    }
}




分组城市:北京
姓名:张三,年龄:15,分数:94,是否毕业:True,城市:北京
姓名:李四,年龄:17,分数:47,是否毕业:False,城市:北京
分组城市:广州
姓名:王二,年龄:19,分数:77,是否毕业:False,城市:广州
分组城市:上海
姓名:孙五,年龄:14,分数:14,是否毕业:False,城市:上海

 对多个元素分组

 var students = new List<Student>
        {
            new Student{Name = "张三",Age = 15,Score = 94,Graduation = true,City = "北京"},
            new Student{Name = "李四",Age = 17,Score = 47,Graduation = false,City = "北京"},
            new Student{Name = "李1",Age = 17,Score = 47,Graduation = false,City = "北京"},
            new Student{Name = "李四",Age = 15,Score = 47,Graduation = false,City = "北京"},
            new Student{Name = "王二",Age = 19,Score = 77,Graduation = false,City = "广州"},
            new Student{Name = "王1",Age = 22,Score = 77,Graduation = false,City = "广州"},
            new Student{Name = "王3",Age = 22,Score = 44,Graduation = false,City = "广州"},
            new Student{Name = "王4",Age = 19,Score = 33,Graduation = false,City = "广州"},
            new Student{Name = "孙1",Age = 20,Score = 14,Graduation = false,City = "上海"},
            new Student{Name = "孙2",Age = 14,Score = 14,Graduation = false,City = "上海"},
            new Student{Name = "孙3",Age = 20,Score = 14,Graduation = false,City = "上海"},
            new Student{Name = "孙4",Age = 14,Score = 14,Graduation = false,City = "上海"}
        };

            var groupByResult = students.GroupBy(s=>new {s.City,s.Age });//返回六个集合,每个集合有item

            foreach (var item in groupByResult)
            {
                foreach(var s in item)
                {
                    Console.WriteLine($"城市:{s.City},分数:{s.Score},name:{s.Name}");
                }
            }
城市:北京,分数:94,name:张三
城市:北京,分数:47,name:李四
城市:北京,分数:47,name:李四
城市:北京,分数:47,name:李1
城市:广州,分数:77,name:王二
城市:广州,分数:33,name:王4
城市:广州,分数:77,name:王1
城市:广州,分数:44,name:王3
城市:上海,分数:14,name:孙1
城市:上海,分数:14,name:孙3
城市:上海,分数:14,name:孙2
城市:上海,分数:14,name:孙4

简单的对分组操作,返回重组后的对象集合

其第一个参数的意思与之前一样,用于指定分组条件。第二个 elementSelector 参数则是与 Select() 方法类似,可以指定输出的分组结果类型。
class Program
{
    static void Main(string[] args)
    {
        var students = new List<Student>
        {
            new Student{Name = "张三",Age = 15,Score = 94,Graduation = true,City = "北京"},
            new Student{Name = "李四",Age = 17,Score = 47,Graduation = false,City = "北京"},
            new Student{Name = "王二",Age = 19,Score = 77,Graduation = false,City = "广州"},
            new Student{Name = "孙五",Age = 14,Score = 14,Graduation = false,City = "上海"}
        };

        var groupByResult = students.GroupBy(x => x.City,student=>new{student.Name,student.City});
        foreach (var item in groupByResult)
        {
            Console.WriteLine($"分组城市:{item.Key}");
            foreach (var student in item)
            {
                Console.WriteLine($"姓名:{student.Name},城市:{student.City}");
            }
        }
    }
}

分组城市:北京
姓名:张三,城市:北京
姓名:李四,城市:北京
分组城市:广州
姓名:王二,城市:广州
分组城市:上海
姓名:孙五,城市:上海

对分组后的集合 再进行操作

class Program
{
    static void Main(string[] args)
    {
        var students = new List<Student>
        {
            new Student{Name = "张三",Age = 15,Score = 94,Graduation = true,City = "北京"},
            new Student{Name = "李四",Age = 17,Score = 47,Graduation = false,City = "北京"},
            new Student{Name = "王二",Age = 19,Score = 77,Graduation = false,City = "广州"},
            new Student{Name = "孙五",Age = 14,Score = 14,Graduation = false,City = "上海"}
        };

        var groupByResult = students.GroupBy(x => x.City, (key, enumerable) =>
        {
            return new
            {
                City = key,
                Avg = enumerable.Average(x => x.Score),
                Max = enumerable.Max(x => x.Score)
            };
        });

        foreach (var student in groupByResult)
        {
            Console.WriteLine($"城市:{student.City},平均分:{student.Avg},最高分:{student.Max}");
        }
    }
}


城市:北京,平均分:70.5,最高分:94
城市:广州,平均分:77,最高分:77
城市:上海,平均分:14,最高分:14

 与上一个类似,不过 限定了后面选择的属性,感觉实际没啥用

 var students = new List<Student>
        {
            new Student{Name = "张三",Age = 15,Score = 94,Graduation = true,City = "北京"},
            new Student{Name = "李四",Age = 17,Score = 47,Graduation = false,City = "北京"},
            new Student{Name = "王二",Age = 19,Score = 77,Graduation = false,City = "广州"},
            new Student{Name = "孙五",Age = 14,Score = 14,Graduation = false,City = "上海"}
        };

            var groupByResult = students.GroupBy(x => x.City, x => new { x.Name, x.City, x.Age, x.Score }, (key, enumerable) =>
            {
                return new
                {
                    City = key,
                    Avg = enumerable.Average(x => x.Score),
                    Max = enumerable.Max(x => x.Score),
                    AvgAge = enumerable.Average(x => x.Age)
                };
            });

            foreach (var student in groupByResult)
            {
                Console.WriteLine($"城市:{student.City},平均分:{student.Avg},最高分:{student.Max},平均年龄:{student.AvgAge}");
            }
发布了89 篇原创文章 · 获赞 4 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/m0_37879526/article/details/104598091