[C#] LINQ之GroupBy - cnxy - 博客园 (cnblogs.com)
LINQ TO SQL 中的group - min.jiang - 博客园 (cnblogs.com)
对查询结果进行分组(C# 中的 LINQ) | Microsoft Docs
代码如下
void Main() { List<Person> personList = new List<Person> { new Person { Name = "P1", Age = 18, Gender = "Male" }, new Person { Name = "P2", Age = 19, Gender = "male", }, new Person { Name = "p2", Age = 17,Gender = "Female", } , new Person { Name = "p3", Age = 17,Gender = "Female", } }; Console.WriteLine("********第一种用法*************************************"); //public static IEnumerable<IGrouping<TKey, TSource>> GroupBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector); //官方释义:根据指定的键选择器函数对序列中的元素进行分组。 var groups = personList.GroupBy(p => p.Gender); // 其等价的LINQ语句为: //var groups = from p in personList // group p by p.Gender; foreach (var group in groups) { Console.WriteLine(group.Key); foreach (var person in group) { Console.WriteLine($" {person.Name},{person.Age}"); } } Console.WriteLine("********第二种用法*************************************"); //public static IEnumerable<IGrouping<TKey, TSource>> GroupBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer); //官方释义:根据指定的键选择器函数对序列中的元素进行分组,并使用指定的比较器对键进行比较。 var groups2 = personList.GroupBy(p => p.Gender, new PersonEqualityComparer()); foreach (var group in groups2) { Console.WriteLine(group.Key.ToString()); foreach (var person in group) { Console.WriteLine($" {person.Name},{person.Age}"); } } Console.WriteLine(); Console.WriteLine("********第三种用法*************************************"); //public static IEnumerable<IGrouping<TKey, TElement>> GroupBy<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector); //官方释义:根据指定的键选择器函数对序列中的元素进行分组,并且通过使用指定的函数对每个组中的元素进行投影。 var groups3 = personList.GroupBy(p => p.Gender, p => new { p.Age, p.Name }); //其等价的LINQ语句为: //var groups3 = from p in personList // group p.Gender by p.Name; foreach (var group in groups3) { Console.WriteLine(group.Key.ToString()); foreach (var o in group) { Console.WriteLine($" {o.Name},{o.Age}"); } } Console.WriteLine(); Console.WriteLine("********第四种用法*************************************"); //public static IEnumerable<TResult> GroupBy<TSource, TKey, TResult>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TKey, IEnumerable<TSource>, TResult> resultSelector); //官方释义:根据指定的键选择器函数对序列中的元素进行分组,并且从每个组及其键中创建结果值。 string GetPersonInfo(string gender, IEnumerable<Person> persons) { string result = $"{gender}: "; foreach (var p in persons) { result += $"{p.Name},{p.Age} "; } return result; } var results4 = personList.GroupBy(p => p.Gender, (g, ps) => GetPersonInfo(g, ps)); //其等价的LINQ语句为: //var results4 = from p in personList // group p by p.Gender into pGroup // select GetPersonInfo(pGroup.Key, pGroup); foreach (var result in results4) { Console.WriteLine(result); } Console.WriteLine(); Console.WriteLine("********第五种用法*************************************"); //public static IEnumerable<IGrouping<TKey, TElement>> GroupBy<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, IEqualityComparer<TKey> comparer); //官方释义:根据键选择器函数对序列中的元素进行分组。通过使用比较器对键进行比较,并且通过使用指定的函数对每个组的元素进行投影。 var groups5 = personList.GroupBy(p => p.Gender, p => new { p.Age, p.Name }, new PersonEqualityComparer()); foreach (var group in groups5) { Console.WriteLine(group.Key.ToString()); foreach (var o in group) { Console.WriteLine($" {o.Name},{o.Age}"); } } Console.WriteLine(); Console.WriteLine("********第六种用法*************************************"); //public static IEnumerable<TResult> GroupBy<TSource, TKey, TResult>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TKey, IEnumerable<TSource>, TResult> resultSelector, IEqualityComparer<TKey> comparer); //官方释义:根据指定的键选择器函数对序列中的元素进行分组,并且从每个组及其键中创建结果值。通过使用指定的比较器对键进行比较。 var results6 = personList.GroupBy(p => p.Gender, (p, ps) => GetPersonInfo(p, ps), new PersonEqualityComparer()); foreach (var result in results6) { Console.WriteLine(result); } Console.WriteLine(); Console.WriteLine("********第七种用法*************************************"); //public static IEnumerable<TResult> GroupBy<TSource, TKey, TElement, TResult>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, Func<TKey, IEnumerable<TElement>, TResult> resultSelector); //官方释义:根据指定的键选择器函数对序列中的元素进行分组,并且从每个组及其键中创建结果值。通过使用指定的函数对每个组的元素进行投影。 string GetPersonInfo_names(string gender, IEnumerable<string> names) { string result = $"{gender}: "; foreach (var name in names) { result += $"{name} "; } return result; } var results7 = personList.GroupBy(p => p.Gender, p => p.Name, (g, ns) => GetPersonInfo_names(g, ns)); foreach (var result in results7) { Console.WriteLine(result); } Console.WriteLine("********第八种用法*************************************"); //第八种用法: //public static IEnumerable<TResult> GroupBy<TSource, TKey, TElement, TResult>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, Func<TKey, IEnumerable<TElement>, TResult> resultSelector, IEqualityComparer<TKey> comparer); //官方释义: 根据指定的键选择器函数对序列中的元素进行分组,并且从每个组及其键中创建结果值。通过使用指定的比较器对键值进行比较,并且通过使用指定的函数对每个组的元素进行投影。 var results = personList.GroupBy(p => p.Gender, (p => new { p.Age, p.Name }), (g, ns) => { string result = $"{g.ToString()}: "; foreach (var n in ns) { result += $" {n.Name},{n.Age}"; } return result; }, new PersonEqualityComparer()); foreach (var result in results) { Console.WriteLine(result); } Console.WriteLine(); } class Person { public string Name { set; get; } public int Age { set; get; } public string Gender { set; get; } public override string ToString() => Name; } class PersonEqualityComparer : IEqualityComparer<string> { public bool Equals(string x, string y) => x.ToUpper() == y.ToUpper(); public int GetHashCode(string obj) => obj.ToUpper().GetHashCode(); }
********第一种用法************************************* Male P1,18 male P2,19 Female p2,17 p3,17 ********第二种用法************************************* Male P1,18 P2,19 Female p2,17 p3,17 ********第三种用法************************************* Male P1,18 male P2,19 Female p2,17 p3,17 ********第四种用法************************************* Male: P1,18 male: P2,19 Female: p2,17 p3,17 ********第五种用法************************************* Male P1,18 P2,19 Female p2,17 p3,17 ********第六种用法************************************* Male: P1,18 P2,19 Female: p2,17 p3,17 ********第七种用法************************************* Male: P1 male: P2 Female: p2 p3 ********第八种用法************************************* Male: P1,18 P2,19 Female: p2,17 p3,17