标准用法
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}");
}