Linq练习

111 阅读4分钟
 namespace ConsoleApp.Model
 {
     public class Customer
     {
         public string ID { get; set; }
         public string City { get; set; }
         public string Country { get; set; }
         public string Region { get; set; }
         public string Sales { get; set; }
 ​
         public override string ToString()
         {
             return "ID:" + ID + "City:" + City + "Country:" + Country + "Region:" + Region + "Sales:" + Sales;
         }
     }
 }
 namespace ConsoleApp.Model
 {
     public class GuestInfo
     {
         /// <summary>
         /// 姓名
         /// </summary>
         public string Name { set; get; }
         /// <summary>
         /// 年龄
         /// </summary>
         public int Age { set; get; }
 ​
 ​
         /// <summary>
         /// 电话
         /// </summary>
         public string Tel { set; get; }
 ​
 ​
         /// <summary>
         /// 电话表
         /// </summary>
         public List<string> TelTable { set; get; }
     }
 }
 namespace ConsoleApp.Model
 {
     public class GuestTitle
     {
         /// <summary>
         /// 姓名
         /// </summary>
         public string Name { get; set; }
 ​
 ​
         /// <summary>
         /// 职务
         /// </summary>
         public string Tilte { get; set; }
     }
 }
 namespace ConsoleApp.Model
 {
     public class Order
     {
         public string ID { get; set; }
         public decimal Amount { get; set; }
     }
 }
 namespace ConsoleApp
 {
     internal class Program
     {
         static void Main(string[] args)
         {
             List<Customer> customers = new List<Customer>
             {
                 new Customer {ID ="A",City ="New York",Country ="USA",Region ="North America",Sales ="9999"},
                 new Customer {ID ="B",City ="New York",Country ="USA",Region ="North America",Sales ="9999"},
                 new Customer {ID ="C",City ="XiAn",Country ="China",Region ="Asia",Sales ="7777"},
                 new Customer {ID ="D",City ="New York",Country ="USA",Region ="North America",Sales ="9999"},
                 new Customer {ID ="E",City ="BeiJing",Country ="China",Region ="Asia",Sales ="8888"},
                 new Customer {ID ="F",City ="New York",Country ="USA",Region ="North America",Sales ="9999"}
             };
             string[] names = { "Alono", "Zheng", "Yuan", "Song", "Simle", "Hsieh", "Small", "She", "Sza", "Sam", "Fa", "Iyl" };
 ​
 ​
             //var queryResults = 
             //    from n in names 
             //    where n.StartsWith("S") 
             //    orderby n descending 
             //    select n;
 ​
             //var queryResults =
             //    names.OrderBy(x => x)
             //    .Where(n => n.StartsWith("S"));
 ​
             //var queryResults =
             //    names.OrderByDescending(x => x)
             //    .Where(x => x.StartsWith("S"));
 ​
             //int[] numbers = GenerateLostofNumbers(12345678);
             //var queryResults = 
             //    from n in numbers
             //    where n < 1000
             //    select n;
 ​
             //Console.WriteLine("聚合运算符==========");
             //Console.WriteLine(queryResults.Count());
             //Console.WriteLine(queryResults.Max());
             //Console.WriteLine(queryResults.Min());
             //Console.WriteLine(queryResults.Average());
             //Console.WriteLine(queryResults.Sum());
 ​
             //var queryResults =
             //    from n in customers
             //    where n.Region == "Asia"
             //    select n;
 ​
             // 投影是在LINQ查询中从其他数据类型中创建新数据类型的术语。
             //var queryResults =
             //    from c in customers
             //    where c.Region == "Asia"
             //    select new { c.City, c.Country, c.Sales};
 ​
             //var queryResults =
             //    customers.Where(c => c.Region == "Asia")
             //    .Select(c => new { c.City, c.Country, c.Sales });
 ​
 ​
             var queryResults =
                 customers.Select(c => new { c.City, c.Country, c.Sales })
                 .Where(c => c.City == "XiAn");
 ​
             foreach (var item in queryResults)
             {
                 Console.WriteLine(item);
             }
 ​
             // 单值选择查询
             var queryResults1 = customers.Select(c => c.Region).Distinct().ToList();
             var queryResults2 =
                 (from c in customers
                  select c.Region).Distinct();
 ​
             // Any & All
             bool anyUSA = customers.Any(c => c.Country == "USA");
             bool allUSA = customers.All(c => c.Country == "USA");
 ​
             // 多级排序
             var queryResult3 =
                 from n in customers
                 where n.Region == "Asia"
                 orderby n.Region, n.Country descending, n.City
                 select n;
 ​
             var queryResult4 =
                 customers.OrderBy(c => c.Region)
                 .ThenByDescending(c => c.Country)
                 .ThenByDescending(c => c.City)
                 .Select(c => new { c.ID, c.Region, c.Country, c.Sales });
 ​
             // 组合查询
             // 组合查询中的数据通过一个键(Key)字段来组合,每一个组中的所有成员都共享这个字段值
             // 在这个例子中 键字段是Region
             // 要计算每个组的总和,应该先生成一个新的结果集cg
             var queryResults5 =
                 from c in customers
                 group c by c.Region into cg
                 select new { TotalSales = cg.Sum(c => long.Parse(c.Sales)), Region = cg.Key };
 ​
             var orderedResults =
                 from cg in queryResults5
                 orderby cg.TotalSales descending
                 select cg;
 ​
             foreach (var item in orderedResults)
                 Console.WriteLine(item.TotalSales + "\t:" + item.Region);
 ​
             foreach (var item in queryResults5)
             {
                 Console.WriteLine(item);
             }
 ​
             // Take() 从查询结果中提取前n个结果
             // Skpi() 从查询结果中跳过前n个结果,返回剩余的结果
             foreach (var item in orderedResults.Take(2))
             {
                 Console.WriteLine(item.TotalSales + "\t:" + item.Region);
             }
 ​
             // First() 返回结果集中第一个匹配给定条件的元素
             // FirstOrDefault() 当查询条件不满足时,将为列表返回默认元素而使用First() 则返回null;
 ​
             List<Order> orders = new List<Order>
             {
                 new Order { ID = "A", Amount = 100 },
                 new Order { ID = "B", Amount = 200 },
                 new Order { ID = "H", Amount = 300 }
             };
             var customersIDs =
                 from c in customers
                 select c.ID;
 ​
             var ordersIDs =
                 from o in orders
                 select o.ID;
 ​
             var customersWithOrders =
                 customersIDs.Intersect(ordersIDs);
 ​
             foreach (var item in customersWithOrders)
             {
                 Console.WriteLine(item);
             }
             Console.WriteLine("=====================");
             var ordersNoCustomers = ordersIDs.Except(customersIDs);
 ​
             foreach (var item in ordersNoCustomers)
             {
                 Console.WriteLine(item);
             }
             Console.WriteLine("=====================");
             var allCustomersOrders = ordersIDs.Union(customersIDs);
 ​
 ​
             foreach (var item in allCustomersOrders)
             {
                 Console.WriteLine(item);
             }
 ​
             // 使用Join运算符在一个查询中查找多个集合中的相关数据
             // 用键字段把结果连接起来
             var queryResults9 =
                 from c in customers
                 join o in orders on c.ID equals o.ID
                 select new { c.ID, c.City, SalesBefore = c.Sales, NewOrder = o.Amount, SalesAfter = c.Sales + o.Amount };
 ​
             foreach (var item in queryResults9)
             {
                 Console.WriteLine(item);
             }
 ​
             List<GuestInfo> list = GetGuestInfos();
             // 按照名字的第一个字进行分组并用分组key进行排序
             Console.WriteLine("into 用于 group 子句的分组时刻");
             var query =
                 from guest in list
                 group guest by guest.Name.Substring(0, 1) into grgust
                 orderby grgust.Key descending
                 select grgust;
 ​
             foreach (var guest in query)
             {
                 Console.WriteLine(string.Format("分组键:{0}\n", guest));
 ​
                 foreach (var g in guest)
                 {
                     Console.WriteLine(string.Format("{0} 电话:{1}", g.Name, g.Tel));
                     Console.WriteLine("=================================");
                 }
             }
 ​
             Console.WriteLine("\ninto 用于Select子句的投影时刻");
             // select 子句中的 info 子句使用
 ​
             var titleList = GetTitleList();
             var query2 =
                 from guest in list
                 join title in titleList
                 on guest.Name equals title.Name
                 into tgroup
                 select new { Name = guest.Name, Titles = tgroup };
 ​
             foreach (var g in query2)
             {
                 Console.WriteLine(g.Name);
                 foreach (var g2 in g.Titles)
                 {
                     Console.WriteLine(string.Format("{0}", g2.Tilte));
                 }
             }
 ​
             Console.WriteLine("\n左外部联接");
             var query3 =
                 from guest in list
                 join title in titleList
                 on guest.Name equals title.Name
                 into tgroup
                 from subtitle in tgroup.DefaultIfEmpty()
                 select new { Name = guest.Name, Title = (subtitle == null ? "空缺" : subtitle.Tilte) };
 ​
             foreach (var g in query3)
             {
                 Console.WriteLine(string.Format("{0}{1}", g.Title, g.Name));
             }
 ​
             var gList = GetGList();
             var queryResult =
                 from guest in gList
                 let g = guest.Name.Substring(0, 1)
                 where g == "肖" || g == "董"
                 select guest;
 ​
             foreach (var g in queryResult)
             {
                 Console.WriteLine(string.Format("{0} 年龄:{1} 电话:{2}", g.Name, g.Age, g.Tel));
             }
 ​
             Console.ReadLine();
         }
 ​
         private static int[] GenerateLostofNumbers(int count)
         {
             Random generator = new Random(1);
             int[] result = new int[count];
             for (int i = 0; i < count; i++)
             {
                 result[i] = generator.Next();
             }
             return result;
         }
 ​
         private static List<GuestInfo> GetGuestInfos()
         {
             //初始化集合
             return new List<GuestInfo>()
             {
                 new GuestInfo
                 {
                     Name = "萧玉霜",
                     Age = 17,
                     Tel = "053*-985690**" },
                 new GuestInfo
                 {
                     Name = "萧玉若",
                     Age = 21,
                     Tel = "035*-120967**"
                 },
                 new GuestInfo
                 {
                     Name = "徐长今",
                     Age = 18,
                     Tel = "039*-967512**"
                 },
                 new GuestInfo
                 {
                     Name = "徐芷晴",
                     Age = 24,
                     Tel = "089*-569832**"
                 }
             };
         }
         private static List<GuestTitle> GetTitleList()
         {
             List<GuestTitle> titleList = new List<GuestTitle>()
             {
                 new GuestTitle{ Name = "林晚荣", Tilte = "金刀汉王"},
                 new GuestTitle{ Name = "林晚荣", Tilte = "天下第一丁"},
                 new GuestTitle{ Name = "肖青漩", Tilte = "出云公主"},
                 new GuestTitle{ Name = "董巧巧", Tilte = "酒店CEO"},
                 new GuestTitle{ Name = "董巧巧", Tilte = "乖巧人儿"}
             };
             return titleList;
         }
 ​
         private static List<GuestInfo> GetGList()
         {
             return new List<GuestInfo>() { new GuestInfo { Name = "林晚荣", Age = 21, Tel = "026*-888888**" }, new GuestInfo { Name = "肖青漩", Age = 21, Tel = "017*-876543**" }, new GuestInfo { Name = "董巧巧", Age = 19, Tel = "029*-981256**" }, };
         }
     }
 }