Beispiel #1
0
        static void ZipOperation()
        {
            var racerNames = from r in Formula1.GetChampions()
                             where r.Country == "Italy"
                             orderby r.Wins descending
                             select new
            {
                Name = r.FirstName + " " + r.LastName
            };

            var racerNamesAndStarts = from r in Formula1.GetChampions()
                                      where r.Country == "Italy"
                                      orderby r.Wins descending
                                      select new
            {
                LastName = r.LastName,
                Starts   = r.Starts
            };


            var racers = racerNames.Zip(racerNamesAndStarts, (first, second) => first.Name + ", starts: " + second.Starts);

            foreach (var r in racers)
            {
                Console.WriteLine(r);
            }
        }
Beispiel #2
0
        static void GroupJoin2()
        {
            var racers = Formula1.GetChampionships()
                         .SelectMany(cs => new List <RacerInfo>()
            {
                new RacerInfo
                {
                    Year      = cs.Year,
                    Position  = 1,
                    FirstName = cs.First.FirstName(),
                    LastName  = cs.First.LastName()
                },
                new RacerInfo
                {
                    Year      = cs.Year,
                    Position  = 2,
                    FirstName = cs.Second.FirstName(),
                    LastName  = cs.Second.LastName()
                },
                new RacerInfo
                {
                    Year      = cs.Year,
                    Position  = 3,
                    FirstName = cs.Third.FirstName(),
                    LastName  = cs.Third.LastName()
                }
            });

            var q = (from r in Formula1.GetChampions()
                     join r2 in racers on
                     new
            {
                FirstName = r.FirstName,
                LastName = r.LastName
            }
                     equals
                     new
            {
                FirstName = r2.FirstName,
                LastName = r2.LastName
            }
                     into yearResults
                     select new
            {
                FirstName = r.FirstName,
                LastName = r.LastName,
                Wins = r.Wins,
                Starts = r.Starts,
                Results = yearResults
            });

            foreach (var r in q)
            {
                Console.WriteLine("{0} {1}", r.FirstName, r.LastName);
                foreach (var results in r.Results)
                {
                    Console.WriteLine("{0} {1}", results.Year, results.Position);
                }
            }
        }
Beispiel #3
0
        // 筛选多个结果
        private static void SelectMany2()
        {
            var racers = Formula1.GetChampionships()
                         .Where(r => r.Year > 2000)
                         .SelectMany(cs => new List <dynamic>() // dynamic 是定义弱对象
                                                                // 自定义对象的属性名
                                                                // 然后用 cs 数据赋值;
                                                                // 将原数据经过封装后, 生成匿名对象返回
            {
                new {
                    Year     = cs.Year,
                    Position = 1,
                    Name     = cs.First,
                    xx       = "hello kitty"
                } /*,
                   * new {
                   * Year = cs.Year,
                   * Position = 2,
                   * Name = cs.Second
                   * }*/
            });

            foreach (var s in racers)
            {
                Console.WriteLine(s);
            }
        }
Beispiel #4
0
        static void GroupingWithNestedObjects()
        {
            var countries = from r in Formula1.GetChampions()
                            group r by r.Country into g
                            orderby g.Count() descending, g.Key
                where g.Count() >= 2
            select new
            {
                Country = g.Key,
                Count   = g.Count(),
                Racers  = from r1 in g
                          orderby r1.LastName
                          select r1.FirstName + " " + r1.LastName
            };

            foreach (var item in countries)
            {
                Console.WriteLine("{0, -10} {1}", item.Country, item.Count);
                foreach (var name in item.Racers)
                {
                    Console.Write("{0}; ", name);
                }
                Console.WriteLine();
            }
        }
Beispiel #5
0
        private static void SelectMany2()
        {
            // flatten the year list to return a list of all racers and positions in the championship
            var racers = Formula1.GetChampionships()
                         .SelectMany(cs => new List <dynamic>()
            {
                new {
                    Year     = cs.Year,
                    Position = 1,
                    Name     = cs.First
                },
                new {
                    Year     = cs.Year,
                    Position = 2,
                    Name     = cs.Second
                },
                new {
                    Year     = cs.Year,
                    Position = 3,
                    Name     = cs.Third
                }
            });


            foreach (var s in racers)
            {
                Console.WriteLine(s);
            }
        }
Beispiel #6
0
        // 使用 Linq 函数实现 Innerjoin
        // 结果 与 InnerJoin() 相同
        static void InnerJoinMethod()
        {
            // 表内交叉
            var racers = Formula1.GetChampions().
                         SelectMany(r => r.Years, (r, y) => new { reacer = r, year = y });

            // 表内交叉
            var teams = Formula1.GetContructorChampions().
                        SelectMany(t => t.Years, (t, y) => new { team = t, year = y });

            // 两个结果再交叉
            var racersAndTeams = racers.Join(teams,
                                             r => r.year,
                                             t => t.year,
                                             (r, t) => new {
                Year        = r.year,
                Champion    = r.reacer.FirstName,
                Constructor = t.team.Name
            }).
                                 OrderBy(y => y.Year).
                                 Take(10);

            foreach (var item in racersAndTeams)
            {
                Console.WriteLine("{0}: {1,-20} {2}",
                                  item.Year, item.Champion, item.Constructor);
            }
        }
Beispiel #7
0
        private static void Conversion()
        {
            //// query executed immediately
            //List<Racer> racers = (from r in Formula1.GetChampions()
            //                      where r.Starts > 150
            //                      orderby r.Starts descending
            //                      select r).ToList();

            //foreach (var racer in racers)
            //{
            //   Console.WriteLine("{0} {0:S}", racer);
            //}

            ILookup <string, Racer> racers = (from r in Formula1.GetChampions()
                                              from c in r.Cars
                                              select new
            {
                Car = c,
                Racer = r
            }).ToLookup(cr => cr.Car, cr => cr.Racer);

            if (racers.Contains("Williams"))
            {
                foreach (var williamsRacer in racers["Williams"])
                {
                    Console.WriteLine(williamsRacer);
                }
            }
        }
Beispiel #8
0
        private static void CombineRacers()
        {
            var q = from r in Formula1.GetChampions()
                    join r2 in Formula1.GetChampionships().GetRacerInfo() on
                    new
            {
                FirstName = r.FirstName,
                LastName  = r.LastName
            }
            equals
            new
            {
                FirstName = r2.FirstName,
                LastName  = r2.LastName
            }
            into yearResults
                select new
            {
                FirstName = r.FirstName,
                LastName  = r.LastName,
                Wins      = r.Wins,
                Starts    = r.Starts,
                Results   = yearResults
            };

            foreach (var item in q)
            {
                Console.WriteLine("{0} {1}", item.FirstName, item.LastName);
                foreach (var item2 in item.Results)
                {
                    Console.WriteLine("{0} {1}", item2.Year, item2.Position);
                }
            }
        }
Beispiel #9
0
        private static void SimpleFilteringWithIndex()
        {
            var racers = Formula1.GetChampions().Where((r, index) => r.LastName.StartsWith("A") && index % 2 != 0);

            foreach (var r in racers)
            {
                Console.WriteLine("{0:A}", r);
            }
        }
Beispiel #10
0
        private static void Sorting()
        {
            var racers = (from r in Formula1.GetChampions()
                          orderby r.Country, r.LastName, r.FirstName
                          select r).Take(10);

            foreach (var racer in racers)
            {
                Console.WriteLine("{0}: {1}, {2}", racer.Country, racer.LastName, racer.FirstName);
            }
        }
Beispiel #11
0
        static void Filtering()
        {
            var racers = from r in Formula1.GetChampions()
                         where r.Wins > 15 && (r.Country == "Brazil" || r.Country == "Austria")
                         select r;

            foreach (var r in racers)
            {
                Console.WriteLine("{0:A}", r);
            }
        }
Beispiel #12
0
        static void LINQQuery()
        {
            var query = from r in Formula1.GetChampions()
                        where r.Country == "Brazil"
                        orderby r.Wins descending
                        select r;

            foreach (var r in query)
            {
                Console.WriteLine("{0:A}", r);
            }
        }
Beispiel #13
0
        // 多个 from 子句实现交叉表查询
        // 如果筛选结果里面有集合, 就可以使用 from 进一步筛选
        static void CompoundFrom()
        {
            var ferrariDrivers = from r in Formula1.GetChampions()
                                 from c in r.Cars // 相当于交叉表一样, 如果 Cars 有多个 Ferrari, 结果就会重复出现几次
                                 where c == "Ferrari" || c == "Lotus"
                                                  // orderby r.LastName
                                 select r.FirstName + " " + r.LastName + " - " + c;

            foreach (var racer in ferrariDrivers)
            {
                Console.WriteLine(racer);
            }
        }
Beispiel #14
0
        static void CompoundFrom()
        {
            var ferrariDrivers = from r in Formula1.GetChampions()
                                 from c in r.Cars
                                 where c == "Ferrari"
                                 orderby r.LastName
                                 select r.FirstName + " " + r.LastName;

            foreach (var racer in ferrariDrivers)
            {
                Console.WriteLine(racer);
            }
        }
Beispiel #15
0
        private static void LambdaExpressions()
        {
            List <Racer>        champions       = new List <Racer>(Formula1.GetChampions());
            IEnumerable <Racer> brazilChampions = champions.
                                                  Where(r => r.Country == "Brazil").
                                                  OrderByDescending(r => r.Wins).
                                                  Select(r => r);

            foreach (Racer r in brazilChampions)
            {
                Console.WriteLine("{0:A}", r);
            }
        }
Beispiel #16
0
        private static void LinqQuery()
        {
            List <Racer> champions = new List <Racer>(Formula1.GetChampions());
            var          query     = from r in Formula1.GetChampions()
                                     where r.Country == "Brazil"
                                     orderby r.Wins descending
                                     select r;

            foreach (Racer r in query)
            {
                Console.WriteLine("{0:A}", r);
            }
        }
Beispiel #17
0
        static void Untyped()
        {
            var list = new System.Collections.ArrayList(Formula1.GetChampions() as System.Collections.ICollection);

            var query = from r in list.Cast <Racer>()
                        where r.Country == "USA"
                        orderby r.Wins descending
                        select r;

            foreach (var racer in query)
            {
                Console.WriteLine("{0:A}", racer);
            }
        }
Beispiel #18
0
        // Cast 转换对象类型
        static void Untyped()
        {
            var list = new System.Collections.ArrayList(Formula1.GetChampions() as System.Collections.ICollection);

            // cast 将只能以 [index] 访问的集合转换成 .propertyName 的形式, 这样才可以用 foreach 遍历
            var query = from r in list.Cast <Racer>()
                        where r.Country == "USA"
                        orderby r.Wins descending
                        select r;

            foreach (var racer in query)
            {
                Console.WriteLine("{0:A}", racer);
            }
        }
Beispiel #19
0
        static void SetOperations()
        {
            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);
            }
        }
Beispiel #20
0
        private static void SimpleFiltering()
        {
            var racers = from r in Formula1.GetChampions()
                         where r.Wins > 15 && (r.Country == "Brazil" || r.Country == "Austria")
                         select r;

            var racers2 = Formula1.GetChampions().
                          Where(r => r.Wins > 15 && (r.Country == "Brazil" || r.Country == "Austria")).
                          Select(r => r);

            foreach (var r in racers2)
            {
                Console.WriteLine("{0:A}", r);
            }
        }
Beispiel #21
0
        static void Aggregate()
        {
            var query = from r in Formula1.GetChampions()
                        where r.Years.Count() > 3
                        orderby r.Years.Count() descending
                        select new
            {
                Name          = r.FirstName + " " + r.LastName,
                TimesChampion = r.Years.Count()
            };

            foreach (var r in query)
            {
                Console.WriteLine("{0} {1}", r.Name, r.TimesChampion);
            }
        }
Beispiel #22
0
        private static void QuantifiersCount()
        {
            var racers = from r in Formula1.GetChampions()
                         where r.Years.Count() >= 3
                         orderby r.Years.Count() descending
                         select new
            {
                Name          = r.FirstName + " " + r.LastName,
                TimesChampion = r.Years.Count()
            };

            foreach (var r in racers)
            {
                Console.WriteLine("{0} {1}", r.Name, r.TimesChampion);
            }
        }
Beispiel #23
0
        static void Grouping()
        {
            var countries = from r in Formula1.GetChampions()
                            group r by r.Country into g
                            orderby g.Count() descending, g.Key
                where g.Count() >= 2
            select new
            {
                Country = g.Key,
                Count   = g.Count()
            };

            foreach (var item in countries)
            {
                Console.WriteLine("{0, -10} {1}", item.Country, item.Count);
            }
        }
Beispiel #24
0
        private static void Ordering()
        {
            //var racers = (from r in Formula1.GetChampions()
            //              orderby r.Country, r.LastName, r.FirstName
            //              select r).Take(10);

            var racers = Formula1.GetChampions().
                         OrderBy(r => r.Country).
                         ThenBy(r => r.LastName).
                         ThenBy(r => r.FirstName).
                         Take(10);

            foreach (var racer in racers)
            {
                Console.WriteLine("{0:C}: {0:L}, {0:F}", racer);
            }
        }
Beispiel #25
0
        /* 结果与 下面的 GroupJoin2() 函数相同
         */
        static void GroupJoinLinq()
        {
            var racers = from cs in Formula1.GetChampionships()
                         select new { Year = cs.Year, Numbers = new List <string>()
                                      {
                                          cs.First, cs.Second, cs.Third
                                      } } into temp
            from r in temp.Numbers
                select new { Year = temp.Year, FirstName = r.FirstName(), LastName = r.LastName(), Position = temp.Numbers.IndexOf(r) + 1 };

            var q = (from r in Formula1.GetChampions()      // 只有冠军
                     join r2 in racers on

                     // 临时匿名对象
                     new
            {
                FirstName = r.FirstName,
                LastName = r.LastName
            }
                     equals
                     new
            {
                FirstName = r2.FirstName,
                LastName = r2.LastName
            }
                     into yearResults
                     select new
            {
                FirstName = r.FirstName,
                LastName = r.LastName,
                Wins = r.Wins,
                Starts = r.Starts,
                Results = yearResults
            });

            foreach (var r in q)
            {
                Console.WriteLine("{0} {1}", r.FirstName, r.LastName);
                foreach (var results in r.Results)
                {
                    Console.WriteLine("{0} {1}", results.Year, results.Position);
                }
            }
        }
Beispiel #26
0
        private static void GroupingAndAggregation()
        {
            var countries = from c in
                            from r in Formula1.GetChampions()
                            group r by r.Country into g
                            select new
            {
                Country = g.Key,
                Wins    = (from x in g
                           select x.Wins).Sum()
            }
            orderby c.Wins descending
            select c;

            foreach (var item in countries)
            {
                Console.WriteLine(item);
            }
        }
Beispiel #27
0
        private static void Grouping()
        {
            var countries = from r in Formula1.GetChampions()
                            group r by r.Country into g
                            orderby g.Count() descending, g.Key
                where g.Count() >= 2
            select new { Country = g.Key, Count = g.Count() };

            //var query = Formula1.GetChampions().
            //    GroupBy(r => r.Country).
            //    OrderByDescending(g => g.Count()).
            //    ThenBy(g => g.Key).
            //    Where(g => g.Count() >= 2).Select(g => new { Country = g.Key, Count = g.Count() });

            foreach (var item in countries)
            {
                Console.WriteLine("{0,-10} {1}", item.Country, item.Count);
            }
        }
Beispiel #28
0
        static void Aggregate2()
        {
            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 country in countries)
            {
                Console.WriteLine("{0} {1}", country.Country, country.Wins);
            }
        }
Beispiel #29
0
        private static void Except()
        {
            var racers = Formula1.GetChampionships().SelectMany(cs => new List <RacerInfo>()
            {
                new RacerInfo {
                    Year      = cs.Year,
                    Position  = 1,
                    FirstName = cs.First.FirstName(),
                    LastName  = cs.First.LastName()
                },
                new RacerInfo {
                    Year      = cs.Year,
                    Position  = 2,
                    FirstName = cs.Second.FirstName(),
                    LastName  = cs.Second.LastName()
                },
                new RacerInfo {
                    Year      = cs.Year,
                    Position  = 3,
                    FirstName = cs.Third.FirstName(),
                    LastName  = cs.Third.LastName()
                }
            });


            var nonChampions = racers.Select(r =>
                                             new
            {
                FirstName = r.FirstName,
                LastName  = r.LastName
            }).Except(Formula1.GetChampions().Select(r =>
                                                     new
            {
                FirstName = r.FirstName,
                LastName  = r.LastName
            }));

            foreach (var r in nonChampions)
            {
                Console.WriteLine("{0} {1}", r.FirstName, r.LastName);
            }
        }
Beispiel #30
0
        static void GroupJoin()
        {
            //  var q =
            //from c in categories
            //join p in products on c equals p.Category into ps
            //select new { Category = c, Products = ps };

            var racers = from r in Formula1.GetChampions()
                         from y in r.Years
                         select new
            {
                Year = y,
                Name = r.FirstName + " " + r.LastName
            };

            var teams = from t in Formula1.GetContructorChampions()
                        from y in t.Years
                        select new
            {
                Year = y,
                Name = t.Name
            };

            var racersAndTeams =
                from r in racers
                join t in teams on r.Year equals t.Year into ts
                select new
            {
                Year        = r.Year,
                Racer       = r.Name,
                Constructor = ts
            };

            foreach (var r in racersAndTeams)
            {
                Console.WriteLine("{0} {1}", r.Year, r.Racer);
                foreach (var t in r.Constructor)
                {
                    Console.WriteLine("\t{0}", t.Name);
                }
            }
        }