1. 程式人生 > 其它 >LINQ之GroupBy(group p by into)

LINQ之GroupBy(group p by into)

[C#] LINQ之GroupBy - cnxy - 部落格園 (cnblogs.com)

程式碼如下

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($"\t{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($"\t{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($"\t{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}:\t"; foreach (var p in persons) { result += $"{p.Name},{p.Age}\t"; } 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($"\t{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}:\t"; foreach (var name in names) { result += $"{name}\t"; } 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()}:\t"; foreach (var n in ns) { result += $"\t{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