高效的LINQ语句(二)

Program.cs代码如下:

 class Program
    {
        private static void Main(string[] args)
        {
            //Sum_All_Scores_Remove_Three_Lowest();
            //Grouping();
            //Group_By_Age_From_Birthdate();
            Title_Of_Longest_Book();
            Console.ReadKey();
        }

         
        public static void Sum_All_Scores_Remove_Three_Lowest()
        {
            var scores = "10,5,0,8,10,1,4,0,10,1";
            var desiredScoreSum = scores
                .Split(',')
                .Select(s => int.Parse(s))
                .OrderBy(s => s)
                .Skip(3)
                .Sum();
            Console.WriteLine(desiredScoreSum);
        }

        public static void Grouping()
        {
            var orders = new List<Order>()
            {
                new Order {Id = 123, Amount = 29.95m, CustomerId = "Mark", Status = "Delivered"},
                new Order {Id = 456, Amount = 45.00m, CustomerId = "Steph", Status = "Refunded"},
                new Order {Id = 768, Amount = 32.50m, CustomerId = "Claire", Status = "Delivered"},
                new Order {Id = 222, Amount = 300.00m, CustomerId = "Mark", Status = "Delivered"},
                new Order {Id = 333, Amount = 465.00m, CustomerId = "Steph", Status = "Awaiting Stock"},
                new Order {Id = 333, Amount = 465.00m, CustomerId = "Steph", Status = "Awaiting Stock"},
            };

            Dictionary<string, List<Order>> ordersByCustomer = OrdersByCustomer(orders);
            foreach (var kvp in ordersByCustomer)
            {
                Console.WriteLine("Key: {0}, Value: {1}", kvp.Key, kvp.Value.Count);
            }

            //
            Dictionary<string, List<Order>> ordersByCustomer2 = orders.GroupBy(o => o.CustomerId).ToDictionary(g => g.Key, g => g.ToList());
            foreach (var kvp in ordersByCustomer2)
            {
                Console.WriteLine("Key: {0}, Value: {1}", kvp.Key, kvp.Value.Count);
            }

        }
        private static Dictionary<string, List<Order>> OrdersByCustomer(List<Order> orders)
        {
            var dict = new Dictionary<string, List<Order>>();
            foreach (var order in orders)
            {
                if (!dict.ContainsKey(order.CustomerId))
                {
                    dict[order.CustomerId] = new List<Order>();
                }
                dict[order.CustomerId].Add(order);
            }
            return dict;
        }

        public static void Group_By_Age_From_Birthdate()
        {
            string namesAndAges = "Phillip Do, 10/10/1978; Mony Taing, 11/10/1979; Mason Do, 03/23/2009; Emma Do, 11/09/2010";
            var result = namesAndAges
                .Split(';')
                .Select(n => n.Split(','))
                .Select(
                    n =>
                        new
                        {
                            Name = n[0].Trim(),
                            DateOfBirth = DateTime.ParseExact(n[1].Trim(), "M/d/yyyy", CultureInfo.InvariantCulture)
                        })
                .OrderByDescending(n => n.DateOfBirth)
                .Select(n =>
                {
                    DateTime today = DateTime.Today;
                    int age = today.Year - n.DateOfBirth.Year;
                    if (n.DateOfBirth > today.AddYears(-age))
                    {
                        age--;
                    }
                    return new { Name = n.Name, Age = age };
                });

            foreach (var item in result)
	        {
                Console.WriteLine(item.Name + "----" + item.Age);
	        }
           
        }

        //---------------------------------------------------------------------------------------------------
        public static void Group_By_Age_From_Birthdate_Clean()
        {
            Func<string, DateTime> parseDob =
                dob => DateTime.ParseExact(dob.Trim(), "M/d/yyyy", CultureInfo.InvariantCulture);
            Func<DateTime, int> getAge = dateOfBirth =>
            {
                DateTime today = DateTime.Today;
                int age = today.Year - dateOfBirth.Year;
                if (dateOfBirth > today.AddYears(-age)) age--;
                return age;
            };

            string namesAndAges =
                "Phillip Do, 10/10/1978; Mony Taing, 11/10/1979; Mason Do, 03/23/2009; Emma Do, 11/09/2010";
            var result = namesAndAges
                .Split(';')
                .Select(n => n.Split(','))
                .Select(n => new { Name = n[0].Trim(), DateOfBirth = parseDob(n[1].Trim()) })
                .OrderByDescending(n => n.DateOfBirth)
                .Select(n => new { Name = n.Name, Age = getAge(n.DateOfBirth) });
        }

        private DateTime ParseDob(string dob)
        {
            return DateTime.ParseExact(dob.Trim(), "M/d/yyyy", CultureInfo.InvariantCulture);
        }

        private int GetAge(DateTime dateOfBirth)
        {
            DateTime today = DateTime.Today;
            int age = today.Year - dateOfBirth.Year;
            if (dateOfBirth > today.AddYears(-age))
            {
                age--;
            }
            return age;
        }
        //---------------------------------------------------------------------------------------------------
        public static void Title_Of_Longest_Book()
        {
            var books = new[]
            {
                new {Author = "Robert Martin", Title = "Clean Code", Pages = 464},
                new {Author = "Oliver Sturm", Title = "Functional Programming in C#", Pages = 270},
                new {Author = "Martin Fowler", Title = "Patterns of Enterprise Application Architecture", Pages = 533},
                new {Author = "Bill Wagner", Title = "Effective C#", Pages = 328}
            };

            var mostPages = books.Max(x => x.Pages);
            var result1 = books.First(b => b.Pages == mostPages);
            var result2 = books.OrderByDescending(b => b.Pages).First();

            // 最好性能
            var result3 = books.Aggregate((agg, next) => next.Pages > agg.Pages ? next : agg);
            Console.WriteLine(result3.Title);
        }
    
    
    }

Model层:

 public class Entities
    {
        public string Name { get; set; }
        public List<string> Pets { get; set; }
    }

    public class Order
    {
        public int Id { get; set; }
        public decimal Amount { get; set; }
        public string CustomerId { get; set; }
        public string Status { get; set; }
    }



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值