Lambda表达式

Posted chaonuanxi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Lambda表达式相关的知识,希望对你有一定的参考价值。

自己保存一些偶尔用的到的Lambda表达式小技巧

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;
namespace Senior
{
    class Program
    {
        static void Main(string[] args)
        {
            #region Lambda表达式
            //使用lambda表达式比匿名方法更节省代码和容易理解,其实lambda表达式是使用匿名函数Rredicate<T>的标准的匿名方法而已
            TraditionDelegateSyntax();

            AnonymousMethodSyntax();

            LambdaExpressionSyntax();

            List<Car> myCars = new List<Car>()
            {
                  new Car{PetName="Henry",Color="Silver",Speed=100,Make="BMW"},
                  new Car{PetName="Daisy",Color="Tan",Speed=90,Make="BMW"},
                  new Car{PetName="Mary",Color="Black",Speed=55,Make="VW"},
                  new Car{PetName="Clunker",Color="Rust",Speed=5,Make="Yugo"},
                  new Car{PetName="Melvin",Color="White",Speed=43,Make="Ford"}
            };

            GetFastCars(myCars);  //访问包含的子对象

            LINQOverArrayList();  //将LINQ查询应用与非泛型集合

            OfTypeAsFilter(); //使用ofType<T>()筛选数据


            ProductInfo[] itemsInstock = new[]{
                new   ProductInfo { Name = " mac‘s CoffDescription", Description= "Coffee with TEETH" ,NumberInStock = 24 },
                new ProductInfo { Name = " Milk Maid Milk" ,Description = "Milk cow‘s love", NumberInStock = 100 },
                new ProductInfo { Name = " Pure Silk Tofu",Description = "Bland as Possible" ,NumberInStock = 120 },
                new  ProductInfo { Name= " Cruchy",Description = "Cheezypepperygoodness", NumberInStock = 2 } ,
                new ProductInfo{ Name = " Ripoff water " ,Description = "From the tap to your wallet",NumberInStock = 100 },
                new ProductInfo { Name ="Classic Valpo Pizza ",Description =" Everyone loves pizza " ,NumberInStock=73}
            };

            SelectEverything(itemsInstock); //获取所有的数据
            ListProductNames(itemsInstock);  //只提取产品的名字
            GetOverstock(itemsInstock);  //获取数据子集
            GetNamesAndDescriptions(itemsInstock);  //投影新数据类型,可投影需要的数据
            GetCountFromQuery();  //使用Enumberable中的Count获取总条数
            ReversetEverything(itemsInstock);//反转结果集
            AlphabetizeProductNumber(itemsInstock); //对表达式中的数量进行升序排序
            DisplayDiff();  // Except方法是返回包含两个容器不同之处的LINQ结果集,是返回第一个List中,在第二个List中没有出现过的值
            DiaplayIntersection(); //Intersect方法是返回两个容器中共同的数据
            DisplayUnion(); //Union方法返回是多个LINQ查询中的所有成员,如果相同成员出现过多次,将只能返回一个
            DisplayConcatNoDups();  //使用Concat()+foreach中调用distinct()方法,可移除重复的数据
            AggregateOps();  //LINQ聚合操作 Max()、Min()、Average()、Sum()方法 它们都位于Enumberable类中
            QueryStringWithOperators(); //用查询操作符建立查询表达式
            QueryStringWithEnumberableAndLambdas(); //通过Enumberable类型赋予Array的扩展方向建立查询表达式
            #endregion

            Console.ReadLine();
        }

        #region Lambda表达式——使用lambda表达式比匿名方法更节省代码和容易理解,其实lambda表达式是使用匿名函数Rredicate<T>的标准的匿名方法而已


        /// <summary>
        /// 使用传统的委托来调用FinAll()
        /// </summary>

        static void TraditionDelegateSyntax()
        {
            //创建一个整数列表
            List<int> list = new List<int>();
            list.AddRange(new int[] { 20, 1, 4, 8, 9, 44 });

            //使用传统委托语法调用FinAll()
            Predicate<int> callback = new Predicate<int>(IsEvenNumber);
            List<int> evenNumbers = list.FindAll(callback);
            foreach (int evenNumber in evenNumbers)
            {
                Console.WriteLine("{0}	", evenNumber);
            }
        }
        static bool IsEvenNumber(int i)
        {
            return (i % 2) == 0;
        }

        /// <summary>
        /// 使用匿名方法,来调用FinAll()
        /// </summary>
        static void AnonymousMethodSyntax()
        {
            List<int> list = new List<int>();
            list.AddRange(new int[] { 20, 1, 4, 8, 9, 44 });
            //使用匿名方法
            List<int> evenNumbers = list.FindAll(delegate(int i)
            {
                return (i % 2) == 0;
            });

            foreach (int evenNumber in evenNumbers)
            {
                Console.WriteLine("{0}	", evenNumber);
            }
        }

        /// <summary>
        /// 使用lambda表达式&&语句块Lambda表达式 代码更加简短
        /// </summary>
        static void LambdaExpressionSyntax()
        {
            List<int> list = new List<int>();
            list.AddRange(new int[] { 20, 1, 4, 8, 9, 44 });
            //现在使用lambda表达式,来调用FinAll()

            //List<int> evenNumbers = list.FindAll(x => (x % 2) == 0);

            //也可以使用语句块编写lambda表达式
            List<int> evenNumbers = list.FindAll(x =>
            {
                bool isEven = (x % 2) == 0;
                return isEven;
            });

            foreach (int evenNumber in evenNumbers)
            {
                Console.WriteLine("{0}	", evenNumber);
            }
        }


        /// <summary>
        /// 访问包含的子对象
        /// </summary>
        /// <param name="myCars"></param>
        public static void GetFastCars(List<Car> myCars)
        {
            var fastCars = from c in myCars where c.Speed > 55 select c;
            foreach (var item in fastCars)
            {
                Console.WriteLine("{0} is going too fast!", item.PetName);
            }
        }

        /// <summary>
        /// 将LINQ查询应用与非泛型集合
        /// </summary>
        static void LINQOverArrayList()
        {
            //这是一个非泛型的集合
            ArrayList arrList = new ArrayList()
           {
                  new Car{PetName="Henry",Color="Silver",Speed=100,Make="BMW"},
                  new Car{PetName="Daisy",Color="Tan",Speed=90,Make="BMW"},
                  new Car{PetName="Mary",Color="Black",Speed=55,Make="VW"},
                  new Car{PetName="Clunker",Color="Rust",Speed=5,Make="Yugo"},
                  new Car{PetName="Melvin",Color="White",Speed=43,Make="Ford"}
           };

            //把ArrayList转换成一个贱人与IEnumberable<T>的类型
            var myCarsEnum = arrList.OfType<Car>();
            var fastCars = from c in myCarsEnum where c.Speed > 55 select c;

            foreach (var item in fastCars)
            {
                Console.WriteLine("{0} is going too fast!", item.PetName);
            }
        }

        /// <summary>
        /// 使用ofType<T>()筛选数据
        /// </summary>
        static void OfTypeAsFilter()
        {
            ArrayList myStuff = new ArrayList();
            myStuff.AddRange(new object[] { 10, 400, 8, false, new Car(), "string data" });
            var myInts = myStuff.OfType<int>();
            foreach (int i in myInts)
            {
                Console.WriteLine("Int value:{0}", i);
            }
        }

        /// <summary>
        /// 获取所有的数据
        /// </summary>
        /// <param name="products"></param>
        static void SelectEverything(ProductInfo[] products)
        {
            var allProducts = from p in products select p;
            foreach (var item in allProducts)
            {
                Console.WriteLine(item.ToString());
            }
        }

        /// <summary>
        /// 只提取产品的名字
        /// </summary>
        /// <param name="products"></param>
        static void ListProductNames(ProductInfo[] products)
        {
            var allProducts = from p in products select p.Name;
            foreach (var item in allProducts)
            {
                Console.WriteLine("Name:{0}", item);
            }
        }

        /// <summary>
        /// 获取数据子集
        /// </summary>
        /// <param name="products"></param>
        static void GetOverstock(ProductInfo[] products)
        {
            var overstock = from p in products where p.NumberInStock > 25 select p;
            foreach (var item in overstock)
            {
                Console.WriteLine(item.ToString());
            }
        }

        /// <summary>
        /// 投影新数据类型,可投影需要的数据
        /// </summary>
        /// <param name="products"></param>
        static void GetNamesAndDescriptions(ProductInfo[] products)
        {
            var nameDesc = from p in products select new { p.Name, p.Description };
            foreach (var item in nameDesc)
            {
                Console.WriteLine(item.ToString());
            }
        }

        /// <summary>
        /// 使用Enumberable获取总条数
        /// </summary>
        static void GetCountFromQuery()
        {
            string[] currentVideoGames = { "Morrowind", "Uncharted 2", "Fallout 3", "Daxter", "System Shock 2" };
            int num = (from c in currentVideoGames where c.Length > 6 select c).Count();

            Console.WriteLine("使用Enumberable获取的条数是{0}", num);
        }

        /// <summary>
        /// 反转结果集
        /// </summary>
        /// <param name="products"></param>
        static void ReversetEverything(ProductInfo[] products)
        {
            var allProducts = from p in products select p;
            foreach (var item in allProducts.Reverse())
            {
                Console.WriteLine(item.ToString());
            }
        }

        /// <summary>
        /// 对表达式中的数量进行升序排序
        /// </summary>
        /// <param name="products"></param>
        static void AlphabetizeProductNumber(ProductInfo[] products)
        {
            var subset = from p in products orderby p.NumberInStock select p;
            foreach (var item in subset)
            {
                Console.WriteLine(item.ToString());
            }
        }

        /// <summary>
        /// Except方法是返回包含两个容器不同之处的LINQ结果集,是返回第一个List中,在第二个List中没有出现过的值
        /// </summary>
        static void DisplayDiff()
        {
            List<string> myCars = new List<string> { "Yugo", "Aztec", "BMW" };
            List<string> yourCars = new List<string> { "BMW", "Saab", "Aztec" };
            var carDiff = (from c in myCars select c).Except(from c2 in yourCars select c2);
            foreach (var item in carDiff)
            {
                Console.WriteLine(item);
            }
        }

        /// <summary>
        /// Intersect方法是返回两个容器中共同的数据
        /// </summary>
        static void DiaplayIntersection()
        {
            List<string> myCars = new List<string> { "Yugo", "Aztec", "BMW" };
            List<string> yourCars = new List<string> { "BMW", "Saab", "Aztec" };
            //获取共同的成员
            var carIntersect = (from c in myCars select c).Intersect(from c2 in yourCars select c2);
            foreach (var item in carIntersect)
            {
                Console.WriteLine(item);
            }
        }

        /// <summary>
        /// Union方法返回是多个LINQ查询中的所有成员,如果相同成员出现过多次,将只能返回一个
        /// </summary>
        static void DisplayUnion()
        {
            List<string> myCars = new List<string> { "Yugo", "Aztec", "BMW" };
            List<string> yourCars = new List<string> { "BMW", "Saab", "Aztec" };
            //合并这两个容器
            var carUnion = (from c in myCars select c).Union(from c2 in yourCars select c2);
            foreach (var item in carUnion)
            {
                Console.WriteLine(item);
            }
        }

        /// <summary>
        /// 使用Concat()+foreach中调用distinct()方法,可移除重复的数据
        /// </summary>
        static void DisplayConcatNoDups()
        {
            List<string> myCars = new List<string> { "Yugo", "Aztec", "BMW" };
            List<string> yourCars = new List<string> { "BMW", "Saab", "Aztec" };
            var carConcat = (from c in myCars select c).Concat(from c2 in yourCars select c2);
            Console.WriteLine("移除重复数据");
            //使用Distinct可以返回非重复的值
            foreach (string item in carConcat.Distinct())
            {
                Console.WriteLine(item);
            }
        }

        /// <summary>
        /// LINQ聚合操作 Max()、Min()、Average()、Sum()方法 它们都位于Enumberable类中
        /// </summary>
        static void AggregateOps()
        {
            double[] winterTemps = { 2.0, -21.3, 8, -4, 0, 8.2 };
            //不同的聚合操作
            Console.WriteLine("Max temp:{0}",(from w in winterTemps select w).Max());
            Console.WriteLine("Min temp:{0}", (from w in winterTemps select w).Min());
            Console.WriteLine("Average temp:{0}", (from w in winterTemps select w).Average());
            Console.WriteLine("Sum temp:{0}", (from w in winterTemps select w).Sum());
        }

        /// <summary>
        /// 用查询操作符建立查询表达式
        /// </summary>
        static void QueryStringWithOperators() 
        {
            string[] currentVideoGames = { "Morrowind", "Uncharted 2", "Fallout 3", "Daxter", "System Shock 2" };
            var subset = from game in currentVideoGames where game.Contains(" ") orderby game select game;
            foreach (var item in subset)
            {
                Console.WriteLine(item);
            }
        }

        /// <summary>
        /// 通过Enumberable类型赋予Array的扩展方向建立查询表达式
        /// </summary>
        static void QueryStringWithEnumberableAndLambdas() 
        {
            Console.WriteLine("通过Enumberable类型赋予Array的扩展方向建立查询表达式");
            string[] currentVideoGames = { "Morrowind", "Uncharted 2", "Fallout 3", "Daxter", "System Shock 2" };
            //通过Enumberable类型赋予Array的扩展方向建立查询表达式
            var subset = currentVideoGames.Where(game => game.Contains(" ")).OrderBy(game => game).Select(game => game);
            foreach (var item in subset)
            {
                Console.WriteLine(item);
            }
        }


        #endregion

    }


    class Car
    {
        public string PetName { get; set; }
        public string Color { get; set; }
        public int Speed { get; set; }
        public string Make { get; set; }
    }

    class ProductInfo
    {
        public string Name { get; set; }
        public string Description { get; set; }
        public int NumberInStock { get; set; }

        public override string ToString()
        {
            return string.Format("Name={0},Description={1},Number in Stock={2}", Name, Description, NumberInStock);
        }
    }
}

以上是关于Lambda表达式的主要内容,如果未能解决你的问题,请参考以下文章

JAVA由一个将JSONArray转成Map的需求引发的lambda语法的学习

函数式编程

C# fun

Lambda表达式

Lambda表达式

Lambda表达式