一個從委託應用到LINQ演變的示例

一,一個賽車手的類表述了賽車手的姓名,國籍,獲獎情況等信息

    [Serializable]
    public class Racer : IComparable, IFormattable
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public int Wins { get; set; }
        public string Country { get; set; }
        public int Starts { get; set; }
        public string[] Cars { get; set; }
        public int[] Years { get; set; }
        
        public override string ToString()
        {
            return string.Format("{0} {1}", FirstName, LastName);
        }

        public string ToString(string format)
        {
            return ToString(format, null);
        }

        public string ToString(string format, IFormatProvider formatProvider)
        {
            switch (format)
            {
                case null:
                case "N":
                    return ToString();
                case "F":
                    return FirstName;
                case "L":
                    return LastName;
                case "A":
                    return String.Format("{0} {1}, {2}; starts: {3}, wins: {4}",
                       FirstName, LastName, Country, Starts, Wins);
                default:
                    throw new FormatException(String.Format(
                       "Format {0} not supported", format));
            }
        }

        public int CompareTo(Racer other)
        {
            return this.LastName.CompareTo(other.LastName);
        }
    }


二,生成賽車手List的類,提供一個方法生成List

    public class Formula1
    {
        public static IList GetChampions()
        {           
            List racers = new List(40);
            racers.Add(new Racer() { FirstName = "Nino", LastName = "Farina", Country = "Italy", Starts = 33, Wins = 5, Years = new int[] { 1950 }, Cars = new string[] { "Alfa Romeo" } });
            racers.Add(new Racer() { FirstName = "Alberto", LastName = "Ascari", Country = "Italy", Starts = 32, Wins = 10, Years = new int[] { 1952, 1953 }, Cars = new string[] { "Ferrari" } });
            racers.Add(new Racer() { FirstName = "Juan Manuel", LastName = "Fangio", Country = "Argentina", Starts = 51, Wins = 24, Years = new int[] { 1951, 1954, 1955, 1956, 1957 }, Cars = new string[] { "Alfa Romeo", "Maserati", "Mercedes", "Ferrari" } });
            racers.Add(new Racer() { FirstName = "Mike", LastName = "Hawthorn", Country = "UK", Starts = 45, Wins = 3, Years = new int[] { 1958 }, Cars = new string[] { "Ferrari" } });
            racers.Add(new Racer() { FirstName = "Phil", LastName = "Hill", Country = "USA", Starts = 48, Wins = 3, Years = new int[] { 1961 }, Cars = new string[] { "Ferrari" } });
            racers.Add(new Racer() { FirstName = "John", LastName = "Surtees", Country = "UK", Starts = 111, Wins = 6, Years = new int[] { 1964 }, Cars = new string[] { "Ferrari" } });
            racers.Add(new Racer() { FirstName = "Jim", LastName = "Clark", Country = "UK", Starts = 72, Wins = 25, Years = new int[] { 1963, 1965 }, Cars = new string[] { "Lotus" } });
            racers.Add(new Racer() { FirstName = "Jack", LastName = "Brabham", Country = "Australia", Starts = 125, Wins = 14, Years = new int[] { 1959, 1960, 1966 }, Cars = new string[] { "Cooper", "Brabham" } });
            racers.Add(new Racer() { FirstName = "Denny", LastName = "Hulme", Country = "New Zealand", Starts = 112, Wins = 8, Years = new int[] { 1967 }, Cars = new string[] { "Brabham" } });
            racers.Add(new Racer() { FirstName = "Graham", LastName = "Hill", Country = "UK", Starts = 176, Wins = 14, Years = new int[] { 1962, 1968 }, Cars = new string[] { "BRM", "Lotus" } });
            racers.Add(new Racer() { FirstName = "Jochen", LastName = "Rindt", Country = "Austria", Starts = 60, Wins = 6, Years = new int[] { 1970 }, Cars = new string[] { "Lotus" } });
            racers.Add(new Racer() { FirstName = "Jackie", LastName = "Stewart", Country = "UK", Starts = 99, Wins = 27, Years = new int[] { 1969, 1971, 1973 }, Cars = new string[] { "Matra", "Tyrrell" } });
            racers.Add(new Racer() { FirstName = "Emerson", LastName = "Fittipaldi", Country = "Brazil", Starts = 143, Wins = 14, Years = new int[] { 1972, 1974 }, Cars = new string[] { "Lotus", "McLaren" } });
            racers.Add(new Racer() { FirstName = "James", LastName = "Hunt", Country = "UK", Starts = 91, Wins = 10, Years = new int[] { 1976 }, Cars = new string[] { "McLaren" } });
            racers.Add(new Racer() { FirstName = "Mario", LastName = "Andretti", Country = "USA", Starts = 128, Wins = 12, Years = new int[] { 1978 }, Cars = new string[] { "Lotus" } });
            racers.Add(new Racer() { FirstName = "Jody", LastName = "Scheckter", Country = "South Africa", Starts = 112, Wins = 10, Years = new int[] { 1979 }, Cars = new string[] { "Ferrari" } });
            racers.Add(new Racer() { FirstName = "Alan", LastName = "Jones", Country = "Australia", Starts = 115, Wins = 12, Years = new int[] { 1980 }, Cars = new string[] { "Williams" } });
            racers.Add(new Racer() { FirstName = "Keke", LastName = "Rosberg", Country = "Finland", Starts = 114, Wins = 5, Years = new int[] { 1982 }, Cars = new string[] { "Williams" } });
            racers.Add(new Racer() { FirstName = "Niki", LastName = "Lauda", Country = "Austria", Starts = 173, Wins = 25, Years = new int[] { 1975, 1977, 1984 }, Cars = new string[] { "Ferrari", "McLaren" } });
            racers.Add(new Racer() { FirstName = "Nelson", LastName = "Piquet", Country = "Brazil", Starts = 204, Wins = 23, Years = new int[] { 1981, 1983, 1987 }, Cars = new string[] { "Brabham", "Williams" } });
            racers.Add(new Racer() { FirstName = "Ayrton", LastName = "Senna", Country = "Brazil", Starts = 161, Wins = 41, Years = new int[] { 1988, 1990, 1991 }, Cars = new string[] { "McLaren" } });
            racers.Add(new Racer() { FirstName = "Nigel", LastName = "Mansell", Country = "UK", Starts = 187, Wins = 31, Years = new int[] { 1992 }, Cars = new string[] { "Williams" } });
            racers.Add(new Racer() { FirstName = "Alain", LastName = "Prost", Country = "France", Starts = 197, Wins = 51, Years = new int[] { 1985, 1986, 1989, 1993 }, Cars = new string[] { "McLaren", "Williams" } });
            racers.Add(new Racer() { FirstName = "Damon", LastName = "Hill", Country = "UK", Starts = 114, Wins = 22, Years = new int[] { 1996 }, Cars = new string[] { "Williams" } });
            racers.Add(new Racer() { FirstName = "Jacques", LastName = "Villeneuve", Country = "Canada", Starts = 165, Wins = 11, Years = new int[] { 1997 }, Cars = new string[] { "Williams" } });
            racers.Add(new Racer() { FirstName = "Mika", LastName = "Hakkinen", Country = "Finland", Starts = 160, Wins = 20, Years = new int[] { 1998, 1999 }, Cars = new string[] { "McLaren" } });
            racers.Add(new Racer() { FirstName = "Michael", LastName = "Schumacher", Country = "Germany", Starts = 250, Wins = 91, Years = new int[] { 1994, 1995, 2000, 2001, 2002, 2003, 2004 }, Cars = new string[] { "Benetton", "Ferrari" } });
            racers.Add(new Racer() { FirstName = "Fernando", LastName = "Alonso", Country = "Spain", Starts = 105, Wins = 19, Years = new int[] { 2005, 2006 }, Cars = new string[] { "Renault" } });
            racers.Add(new Racer() { FirstName = "Kimi", LastName = "Räikkönen", Country = "Finland", Starts = 122, Wins = 15, Years = new int[] { 2007 }, Cars = new string[] { "Ferrari" } });
            return racers;
        }

    }

 

三,示例代碼

    static class  Program
    {
        static void Main(string[] args)
        {
            //使用普通的委託
            List racers = new List(Formula1.GetChampions());

            List brazilRacers = racers.FindAll(IsBrazilHandle);
            brazilRacers.Sort(SortRacersHandle);

            foreach (Racer r in brazilRacers)
            {
                Console.WriteLine("使用普通的委託");
                Console.WriteLine("{0:A}", r);
                r.PutInfo(DateTime.Now);
            }

            //使用匿名委委託          
            racers = new List(Formula1.GetChampions());
            brazilRacers = racers.FindAll(
                delegate(Racer r)
                {
                    return r.Country == "Brazil";
                });

            brazilRacers.Sort(
                delegate(Racer r1, Racer r2)
                {
                    return r2.Wins.CompareTo(r1.Wins);
                }
                );

            foreach (Racer r in brazilRacers)
            {
                Console.WriteLine("使用匿名代理");
                Console.WriteLine("{0:A}", r);
                r.PutInfo(DateTime.Now);
            }



            //使用LINQ類提供的擴展方法
            racers = new List(Formula1.GetChampions());

            brazilRacers.Where(
            delegate(Racer r)
            {
                return r.Country == "Brazil";
            });

            brazilRacers.OrderByDescending(
               delegate(Racer r)
               {
                   return r.Wins;
               });

            brazilRacers.Select(
                delegate(Racer r)
                {
                    return r;
                });


            foreach (Racer r in brazilRacers)
            {
                Console.WriteLine("LINQ類的擴展方法");
                Console.WriteLine("{0:A}", r);
                r.PutInfo(DateTime.Now);
            }

            //運用Lamda表括達式
            racers = new List(Formula1.GetChampions());

            racers.Where(r => r.Country == "Brazil");
            racers.OrderByDescending(r => r.Wins);
            racers.Select(r => r);

            foreach (Racer r in brazilRacers)
            {
                Console.WriteLine();
                Console.WriteLine("Lamda表括達式{0:A}", r);
                r.PutInfo(DateTime.Now);
            }

            //最終演變爲LINQ查詢
            racers = new List(Formula1.GetChampions());
            var query = from r in racers
                        where r.Country == "Brazil"
                        orderby r.Wins descending
                        select r;

            foreach (Racer r in query)
            {
                Console.WriteLine();
                Console.WriteLine("LINQ查詢{0:A}", r);
                r.PutInfo(DateTime.Now);
            }

            Console.Read();

        }

        /// 
        /// 擴展方法實例
        /// 調用擴展方法只是調用靜態方法的一種新語法
        /// 
        /// 
        public static void PutInfo(this Racer r, DateTime dt)
        {
            Console.WriteLine("{0}", dt.ToLongTimeString());
        }

        /// 
        /// 用於查找
        /// 
        public static Predicate IsBrazilHandle = IsBrazil;

        public static bool IsBrazil(Racer r)
        {
            if (r.Country == "Brazil")
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        /// 
        /// 用於排序
        /// 
        public static Comparison SortRacersHandle = new Comparison(SortRacers);

        public static int SortRacers(Racer r1, Racer r2)
        {
            int index = r2.Wins.CompareTo(r1.Wins);
            return index;
        }
            

    }

 

說明:該示例參照C#高級編程中關於LINQ的講解

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章