LINQ相关的集合操作

摘选自C#高级编程(第9版) --C# 5.0 & .NET 4.5.1

Code:

      static void Main(string[] args)
        {
            LinqQuery();

            object[] data = { "one", 2, 3, "four", "five", 6 };
            var q = data.OfType<string>();//OfType使用

            //多个from,实际是转为SelectMany()扩展方法
            var ferraiDrivers = from r in Formula1.GetChampions()
                                from c in r.Cars
                                where c == "Ferrari"
                                orderby r.LastName
                                select r.FirstName + " " + r.LastName;
            //对应扩展方法为
            var ferraiDrivers2 = Formula1.GetChampions()
                .SelectMany(r => r.Cars, (r, c) => new { Racer = r, Car = c })
                .Where(r => r.Car == "Ferrari")
                .OrderBy(r => r.Racer.LastName).Select(r => r.Racer.FirstName + " " + r.Racer.LastName);

            foreach (var s in ferraiDrivers)
                Console.WriteLine(s);

            //join
            var racersAndTeams = (from r in
                                      from r1 in Formula1.GetChampions()
                                      from yr in r1.Years
                                      select new
                                      {
                                          Year = yr,
                                          Name = r1.FirstName + " " + r1.LastName
                                      }
                                  join t in
                                    from t1 in Formula1.GetContructorChampions()
                                    from yt in t1.Years
                                    select new
                                    {
                                        Year = yt,
                                        Name = t1.Name
                                    }
                                  on r.Year equals t.Year
                                  orderby t.Year
                                  select new
                                  {
                                      Year = r.Year,
                                      Racer = r.Name,
                                      Team = t.Name
                                  }).Take(10);

            foreach (var item in racersAndTeams)
            {
                Console.WriteLine("{0}: {1,-20} {2}", item.Year, item.Racer, item.Team);
            }

            //Intersect操作
            Func<string, IEnumerable<Racer>> racersByCar =
                car => from r in Formula1.GetChampions()
                       from c in r.Cars
                       where c == car
                       orderby r.LastName
                       select r;

            Console.WriteLine("World champion with Ferrari and McLaren");
            foreach (var racer in racersByCar("Ferrari").Intersect(racersByCar("McLaren")))
            {
                Console.WriteLine(racer);
            }

            //Zip(合并)
            Console.WriteLine("Zip:");
            var racerNames = from r in Formula1.GetChampions()
                             where r.Country == "Itally"
                             orderby r.Wins descending
                             select new
                             {
                                 Name = r.FirstName + " " + r.LastName
                             };
            var racerNamesAndStarts = from r in Formula1.GetChampions()
                                      where r.Country == "Itally"
                                      orderby r.Wins descending
                                      select new
                                      {
                                          LastName = r.LastName,
                                          Starts = r.Starts
                                      };
            var racers = racerNames.Zip(racerNamesAndStarts, (a, b) => a.Name + ",Starts:" + b.Starts);
            foreach (var r in racers)
                Console.WriteLine(r);

            //count sum
            var query = from r in Formula1.GetChampions()
                        let nYears = r.Years.Count()
                        where nYears >= 3
                        orderby nYears descending, r.LastName
                        select new
                        {
                            Name = r.FirstName + " " + r.LastName,
                            TimesChampion = nYears
                        };
            foreach (var r in query)
                Console.WriteLine("{0} {1}", r.Name, r.TimesChampion);

            var countries = (from c in
                                 from r in Formula1.GetChampions()
                                 group r by r.Country into c
                                 select new
                                 {
                                     Country = c.Key,
                                     Wins = (from r1 in c select r1.Wins).Sum()
                                 }
                             orderby c.Wins descending, c.Country
                             select c).Take(5);
            foreach (var c in countries)
                Console.WriteLine("{0} {1}", c.Country, c.Wins);

            //非类型化的集合操作
            var l = new ArrayList(Formula1.GetChampions() as ICollection);
            var query1 = from r in l.Cast<Racer>()
                         where r.Country == "USA"
                         orderby r.Wins descending
                         select r;
            foreach (var r in query1)
                Console.WriteLine("{0:A}", r);

            Console.ReadKey();
        }

        private static void LinqQuery()
        {
            var q = from r in Formula1.GetChampions()
                    where r.Country == "Brazil"
                    orderby r.Wins descending
                    select r;
            //使用扩展方法
            var racers = Formula1.GetChampions()
                 .Where((r, index) => r.LastName.StartsWith("A") && index % 2 != 0);

            foreach (Racer r in racers)
            {
                Console.WriteLine("{0:A}", r);
            }
        }


注: 相关实体类见书



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值