继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

【C#】小知识#6:Lambda + LINQ使用statement body(语句块)不使用expression情况

慕后端1076238
关注TA
已关注
手记 50
粉丝 6
获赞 16

最近看到一个使用Lambda + LINQ不好的例子,举例:

资讯公司员工辛苦上市,尾牙特别奖赏员工

每人最起码发放10000奖金(dgmingkai)

假如入职满一年奖金+20000,满两年奖金+40000

因为信息部门KPI特别好,增加额外奖金+30000

以下是模拟他的写法,可以看到缺点

重复呼叫方法GetYearDif

每个条件写一个三元表达式,条件变多会难以维护

void Main()

{

//测试数据,实际上数据在Excel

var datas = new List<Employee>(){

new Employee{Name=“小明”,Department=Dep.信息部,EntryDate=DateTime.Parse(“2015/01/01”)},

new Employee{Name=“小华”,Department=Dep.信息部,EntryDate=DateTime.Parse(“2017/01/01”)},

new Employee{Name=“小新”,Department=Dep.业务部,EntryDate=DateTime.Parse(“2014/01/01”)}

};

NewYearBonusService.Excute(datas);

}

abstract class NewYearBonusService

{

private const decimal DefaultBonus = 10000;

public static void Excute(IEnumerable<Employee> datas)

{

datas.Select(s => new {Employee = s,bonus=

s.Department == Dep.信息部&& GetYearDif(DateTime.Now,s.EntryDate)>= 2?DefaultBonus + 30000 + 40000:

s.Department == Dep.信息部&& GetYearDif(DateTime.Now,s.EntryDate)>= 1?DefaultBonus + 30000 + 20000:

s.Department == Dep.信息部?DefaultBonus + 30000:

DefaultBonus

}).Dump();

}

private static int GetYearDif(DateTime d1,DateTime d2)

{

var dif =(int)((d2 - d1).TotalDays / 365);

if(dif < 0)dif *= -1;

return dif;

}

}

enum Dep{信息部,业务部}

class Employee{

public string Name { get;set;}

public Dep Department { get;set;}

public DateTime EntryDate { get;set;}

}

询问对方才发现他以为只能使用expression body,不知道可以使用statement body,在这个例子其实可以改成语句块作法,如以下示例:

1.可以加上if判断

2.宣告变数重复利用

3.甚至可以做简单防呆

abstract class NewYearBonusService

{

private const decimal DefaultBonus = 10000;

public static void Excute(IEnumerable<Employee> datas)

{

datas.Select(s =>


{

var bonus = DefaultBonus;

var yearDif = GetYearDif(DateTime.Now,s.EntryDate);

if(s == null)throw new Exception(“数据为空,请检查数据”);

if(s.Department == Dep.信息部)bonus+=30000;

if(yearDif>=2)bonus+=40000;else if(yearDif>=1)bonus+= 20000;

return new { Employee=s,bonus};

}

).Dump();

}

}

为什么可以这么方便?可以藉由反编译代码看到底层还是委托(delegate),只是系统帮我们生成而已(zflwx)。

补充

这是LINQ + Lambda才能使用的方法,单纯LINQ是不能简单套用

使用编辑器是LINQPAD,Dump()是里面的扩充方法,可以用Console.WriteLine取代

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP