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)));