Linq101-Grouping Operators

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 
  5 namespace Linq101
  6 {
  7     class Grouping
  8     {
  9         /// <summary>
 10         /// This sample uses group by to partition a list of numbers by their remainder when divided by 5.
 11         /// </summary>
 12         public void Linq40()
 13         {
 14             int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
 15 
 16             var numberGroups = from n in numbers
 17                                group n by n % 5 into g
 18                                select new { Remainder = g.Key, Numbers = g };
 19 
 20             foreach (var numberGroup in numberGroups)
 21             {
 22                 Console.WriteLine("除以5余数为{0}的有:", numberGroup.Remainder);
 23                 foreach (var n in numberGroup.Numbers)
 24                 {
 25                     Console.WriteLine(n);
 26                 }
 27             }
 28         }
 29 
 30         /// <summary>
 31         /// This sample uses group by to partition a list of words by their first letter.
 32         /// </summary>
 33         public void Linq41()
 34         {
 35             string[] words = { "blueberry", "chimpanzee", "abacus", "banana", "apple", "cheese" };
 36 
 37             var wordGroups = from w in words
 38                              group w by w[0] into g
 39                              select new { FirstLetter = g.Key, words = g };
 40 
 41             foreach (var wordGroup in wordGroups)
 42             {
 43                 Console.WriteLine("以字母{0}开头的单词有:", wordGroup.FirstLetter);
 44                 foreach (var word in wordGroup.words)
 45                 {
 46                     Console.WriteLine(word);
 47                 }
 48             }
 49         }
 50 
 51         /// <summary>
 52         /// This sample uses group by to partition a list of products by category.
 53         /// </summary>
 54         public void Linq42()
 55         {
 56             var products = Data.GetProductList();
 57 
 58             var productGroups = from p in products
 59                                 group p by p.Category into g
 60                                 select new { Category = g.Key, products = g };
 61 
 62             //ObjectDumper.Write(productGroups,1);
 63 
 64             foreach (var productGroup in productGroups)
 65             {
 66                 Console.WriteLine("分类为{0}的产品有:", productGroup.Category);
 67                 foreach (var product in productGroup.products)
 68                 {
 69                     ObjectDumper.Write(product);
 70                 }
 71             }
 72         }
 73 
 74         /// <summary>
 75         /// This sample uses group by to partition a list of each customer's orders, first by year, and then by month.
 76         /// </summary>
 77         public void Linq43()
 78         {
 79             var customers = Data.GetCustomerList();
 80 
 81             var customerOrderGroups = from c in customers
 82                                       select new
 83                                       {
 84                                           c.CompanyName,
 85                                           YearGroups = from o in c.Orders
 86                                                        group o by o.OrderDate.Year into yg
 87                                                        select new
 88                                                        {
 89                                                            Year = yg.Key,
 90                                                            MonthGoups = from o in yg
 91                                                                         group o by o.OrderDate.Month into mg
 92                                                                         select new { Month = mg.Key, mg }
 93                                                        }
 94                                       };
 95 
 96             ObjectDumper.Write(customerOrderGroups, 3);
 97         }
 98 
 99         /// <summary>
100         /// This sample uses GroupBy to partition trimmed elements of an array using a custom comparer that matches words that are anagrams of each other.
101         /// </summary>
102         public void Linq44()
103         {
104             string[] anagrams = { "from   ", " salt", " earn ", "  last   ", " near ", " form  " };
105 
106             var query = anagrams.GroupBy(w => w.Trim(), new AnagramEqualityComparer());
107 
108             ObjectDumper.Write(query, 1);
109         }
110 
111         private class AnagramEqualityComparer : IEqualityComparer<string>
112         {
113             public bool Equals(string x, string y)
114             {
115                 return getCanonicalString(x) == getCanonicalString(y);
116             }
117 
118             public int GetHashCode(string obj)
119             {
120                 return getCanonicalString(obj).GetHashCode();
121             }
122 
123             private string getCanonicalString(string word)
124             {
125                 char[] wordChars = word.ToCharArray();
126                 Array.Sort(wordChars);
127                 return new string(wordChars);
128             }
129         }
130 
131         /// <summary>
132         /// This sample uses GroupBy to partition trimmed elements of an array using a custom comparer that matches words that are anagrams of each other, and then converts the results to uppercase.
133         /// </summary>
134         public void Linq45()
135         {
136             string[] anagrams = { "from   ", " salt", " earn ", "  last   ", " near ", " form  " };
137 
138             var query = anagrams.GroupBy(w => w.Trim(),
139                 a => a.ToUpper(),
140                 new AnagramEqualityComparer());
141 
142             ObjectDumper.Write(query, 1);
143         }
144     }
145 }

 

posted @ 2014-12-31 16:52  David Huang  阅读(337)  评论(0编辑  收藏  举报