前言
1、"Lambda表达式"是一个匿名函数,是一种高效的类似于函数式编程的表达式,Lambda简化了开发中需要编写的代码量,lambda表达式简化了匿名委托的使用。
2、它可以包含表达式和语句,并且可用于创建委托或表达式目录树类型,支持带有可绑定到委托或表达式树的输入参数的内联表达式。
简洁
lambda运算符:所有的lambda表达式都是用新的lambda运算符 " => ",可以叫他,“转到”或者 “成为”。运算符将表达式分为两部分,左边指定输入参数,右边是lambda的主体。
lambda表达式:
1.一个参数:param => expr
2.多个参数:(param, list) => expr
namespace study_lambda
{
/// <summary>
/// 委托跟表达式的两段代码,我们可以看出一些东东吧:其实表达式(p => p + 10;)中的 p 就代表委托方法中的参数,而表达式符号右边的 p+10,就是委托方法中的返回结果。
/// </summary>
class LambdaPrinciple
{
delegate int HuaQian(int money);
// 委托
void Test()
{
HuaQian hq = HqTest;
int money = hq(10);
}
public int HqTest(int money)
{
return money + 10;
}
//表达式
void Test2()
{
HuaQian hq = p => p + 10;
int money = hq(10);
}
delegate int HuaQian1(int money, int money2);
//多参数
void Test3() {
HuaQian1 hq = (p, m) => p + m;
int money = hq(1, 2);
}
//lambda主体运算复杂
void Test4() {
HuaQian1 hq = (p, m) => {
if (p < 0)
{
return m;
}
else
{
return p + m;
}
};
}
}
}
using System.Collections.Generic;
namespace study_lambda
{
class Employee
{
public string Name { get; set; }
public string Code { get; set; }
public int Age { get; set; }
public Employee(string name, string code, int age)
{
Name = name;
Code = code;
Age = age;
}
public static List<Employee> CreateEmployees()
{
List<Employee> employees = new List<Employee>();
Employee employee = new Employee("gongyg", "SC0001", 29);
employees.Add(employee);
employee = new Employee("gumd", "SC0002", 31);
employees.Add(employee);
employee = new Employee("gongxy", "SC0003", 3);
employees.Add(employee);
employee = new Employee("gongxh", "SC0004", 1);
employees.Add(employee);
employee = new Employee("gongyg", "SC0005", 29);
employees.Add(employee);
return employees;
}
public override string ToString()
{
return Name + "-" + Code + "-" + Age;
}
}
class Score
{
public string Code { get; set; }
public string Project { get; set; }
public int ProjectScore { get; set; }
public Score(string code, string project, int projectScore)
{
Code = code;
Project = project;
ProjectScore = projectScore;
}
public static List<Score> CreateScores()
{
List<Score> scores = new List<Score>();
Score score = new Score("SC0001", "数学", 89);
scores.Add(score);
score = new Score("SC0001", "语文", 49);
scores.Add(score);
score = new Score("SC0001", "英语", 29);
scores.Add(score);
score = new Score("SC0002", "数学", 68);
scores.Add(score);
score = new Score("SC0003", "数学", 73);
scores.Add(score);
score = new Score("SC0004", "数学", 56);
scores.Add(score);
return scores;
}
}
}
using System.Collections.Generic;
using System.Linq;
namespace study_lambda
{
/// <summary>
/// List集合中的Lambda表达式的运用
/// </summary>
class Program
{
static void Main(string[] args)
{
List<Employee> employees = Employee.CreateEmployees();
List<Score> scores = Score.CreateScores();
//查询
List<Employee> emps = employees.Where(p => p.Age > 20 || p.Name == "gongxy" || p.Name.Contains("g")).ToList();
//返回第一个符合条件的数据,不存在的时候返回Null。
//当查询条件能查到多个时,直接报异常
Employee emp = employees.SingleOrDefault(p => p.Name == "gumd1");
//返回第一个符合条件的数据,不存在的时候返回Null。
Employee emp2 = employees.FirstOrDefault(p => p.Name == "gongyg");
//排序
//string.Join(',', emps2)
//OrderBy 从小到大
//OrderByDescending 从大到小
List<Employee> emps2 = employees.OrderBy(p => p.Age).ToList();
List<Employee> emps3 = employees.OrderByDescending(p => p.Age).ToList();
//返回符合条件的实体个数
int employeeNumber = employees.Count(p => p.Age >= 20);
//查找所有名字中含有【g】的实体集合
List<Employee> emps4 = employees.FindAll(p => p.Name.Contains("g")).ToList();
List<IGrouping<string, Employee>> strs = employees.GroupBy(p => p.Name).ToList();
foreach (IGrouping<string, Employee> item in strs)
{
string key = item.Key;
}
//返回最大的年龄
int age = employees.Max(p => p.Age);
//对所有年龄求和
int ageSum = employees.Sum(p => p.Age);
//求年龄的平均值
double ageAvg = employees.Average(p => p.Age);
//获取所有学生姓名,并去重
List<string> strs2 = employees.Select(p => p.Name).Distinct().ToList();
//匿名类型
var emps5 = employees.Select(p => new { p.Name, p.Code });
foreach (var item in emps5)
{
string name = item.Name;
string code = item.Code;
}
}
}
}