5lamdba

什么lamdba表达式

是一种匿名方法,定义方法时候不需要写访问区分符,方法名等等
作用:简化方法的定义

lamdba表达式语法

参数列表)=>{方法体}

定义一个无参数无返回值的方法
()=>{}
定义一个有参数无返回值的方法
(A)=>{};
定义一个有一个参数有返回值的方法
(A)=>{return …};
定义两个参数有返回值的方法
(A,B)=>{return …};

lamdba表达式语法一般用于某些需要传一个委托为参数的方法

比如:List泛型集合里,很多方法都可以传委托,因此可以自己写一个符合委托的方法传进去,让其执行我们写的逻辑,但是写方法太麻烦,所以就可以使用lamdba代替

实现list的排序筛选方法

/// <summary>
/// 自定义循环方法
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="list"></param>
/// <param name="action"></param>
public static void MyForeach<T>(this List<T> list, Action<T> action)
{
    //循环输出list里的元素
    for (int i = 0; i < list.Count; i++)
    {
        //执行用户传的方法
        action(list[i]);
    }
}
/// <summary>
/// 判断集合中值是否相等
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="list"></param>
/// <param name="action"></param>
/// <returns></returns>
public static T MyFirstOrDefault<T>(this List<T> list, Func<T ,bool> action)
{
    for (int i = 0; i < list.Count; i++)
    {
        //调用委托判断是否和集合当前的元素相等
        if (action(list[i]))
        {
            return list[i];
        }
    }
    //循环完没找到就返回默认值
    return default(T);
}
/// <summary>
/// 自己写的Where扩展方法
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="list"></param>
/// <param name="pre"></param>
/// <returns></returns>
public static List<T> MyWhere<T>(this List<T> list, Predicate<T> pre)
{
    List<T> newList = new List<T>();
    foreach (var item in list)
    {
        if (pre(item))
        {
            newList.Add(item);
        }
    }
    return newList;
}

使用匿名方法实现排序及筛选

List<string> myList = new List<string>() { "葡萄", "香蕉", "西瓜", "木瓜", "哈密瓜", "西瓜","香瓜" };
            //lamdba实现查询
            Console.WriteLine("请输入要查找的水果名");
            string name = Console.ReadLine();
            //查指定的水果,只能找到第一次匹配的项
            //string jgname = myList.FirstOrDefault((a) => { return a == name; });
            //使用会First报错
            //调用自己写的扩展方法
            //string jgname = myList.MyFirstOrDefault(a => name == a);
            //Console.WriteLine(jgname);
            //查指定的水果,只能找到所有匹配的项(精确查找)
            //List<string> myList2 = myList.Where((a) => { return a == name; }).ToList();
            //查指定的水果,只能找到所有匹配的项(模糊查找)1
            //List<string> myList2 = myList.Where((a) => { return a.Contains(name); }).ToList();
            //查指定的水果,只能找到所有匹配的项(模糊查找)2,并排序,OrderBy升序,OrderByDescending降序
            //List<string> myList2 = myList.Where((a) => { return a.IndexOf(name) > -1; }).OrderByDescending((a) => { return a; }).ToList();
            //foreach (var item in myList2)
            //{
            //    Console.WriteLine(item);
            //}

使用匿名方法实现排序及筛选2(结合对象)

用到的用户信息类如下:

public class UserInfo
    {
        public string name { get; set; }
        public int age { get; set; }
        public string address { get; set; }
    }

具体

List<UserInfo> myList = new List<UserInfo>();
            myList.Add(new UserInfo() { name = "李清照", age = 23, address = "宋" });
            myList.Add(new UserInfo() { name = "黄月英", age = 18, address = "三国" });
            myList.Add(new UserInfo() { name = "黄忠", age = 50, address = "三国" });
            myList.Add(new UserInfo() { name = "黄某", age = 27, address = "三国" });
            myList.Add(new UserInfo() { name = "黄某", age = 35, address = "三国" });
            Console.WriteLine("输入要查找的姓名");
            string name = Console.ReadLine();
            Console.WriteLine("输入要查找的地址");
            string address = Console.ReadLine();
            //根据姓名模糊查询和地址精确查询并且根据年龄排序
            //List<UserInfo> jgmyList = myList.Where((a) => { return a.name.Contains(name) && a.address == address; }).OrderBy((b) => { return b.age; }).ToList();
            //循环遍历
            //foreach (UserInfo item in jgmyList)
            //{
            //    Console.WriteLine(string.Format("用户名:{0},年龄:{1},地址:{2}", item.name, item.age, item.address));
            //}
            //不输入条件查全表,输入姓名按照姓名查,输入地址按照地址查,都输入的话就表示精确查找
            //List<UserInfo> jgmyList = myList.Where((a) =>
            //{
            //    //返回一个false就表示没有满足条件,最后转换成集合,集合里也为空
            //    return (string.IsNullOrWhiteSpace(name) || a.name == name) && (string.IsNullOrWhiteSpace(address) || a.address == address);
            //}).OrderBy((b) =>
            //{
            //    return b.age;
            //}).ToList();
            //简写上一个匿名方法
            List<UserInfo> jgmyList = myList.Where(a=>(string.IsNullOrWhiteSpace(name)||a.name==name)&&
                (string.IsNullOrWhiteSpace(address)||a.address==address)).OrderBy(b=>b.age).ToList();
            //满足条件的数据条数
            //Console.WriteLine(jgmyList.Count);
            ////自定义循环
            //jgmyList.ForEach((item) =>
            //{
            //    Console.WriteLine(string.Format("用户名:{0},年龄:{1},地址:{2}", item.name, item.age, item.address));
            //});
            //调用自己写的扩展循环方法
            jgmyList.MyForeach(item => Console.WriteLine(string.Format("用户名:{0},年龄:{1},地址:{2}", item.name, item.age, item.address)));
posted @ 2021-11-02 10:21  青仙  阅读(64)  评论(0编辑  收藏  举报