最近看到一个使用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取代
共同學(xué)習(xí),寫(xiě)下你的評(píng)論
評(píng)論加載中...
作者其他優(yōu)質(zhì)文章
100積分直接送
付費(fèi)專(zhuān)欄免費(fèi)學(xué)
大額優(yōu)惠券免費(fèi)領(lǐng)