了解Linq。 我有以下代码:
(请原谅数据集的可怜大小)
class Program
{
static void Main(string[] args)
{
var employees = new List<Employee>
{
new Employee
{
Name = "Bill Bailey",
EmployeeCode = 12345,
Department = "Comedy Lab",
DateOfBirth = DateTime.Parse("13/01/1964"),
CurrentEmployee = true
},
new Employee
{
Name = "Boris Johnson",
EmployeeCode = 56789,
Department = "Cycling Dept.",
DateOfBirth = DateTime.Parse("19/06/1964"),
CurrentEmployee = true
},
new Employee
{
Name = "Bruce Forsyth",
EmployeeCode = 5,
Department = "Comedy Lab",
DateOfBirth = DateTime.Parse("22/03/1928"),
CurrentEmployee = false
},
new Employee
{
Name = "Gordon Brown",
EmployeeCode = 666,
Department = "Backbenches",
DateOfBirth = DateTime.Parse("20/02/1951"),
CurrentEmployee = false
},
new Employee
{
Name = "Russell Howard",
EmployeeCode = 46576,
Department = "Comedy Lab",
DateOfBirth = DateTime.Parse("23/03/1980"),
CurrentEmployee = false
}
};
Func<Employee, bool> oapCalculator = (employee => employee.DateOfBirth.AddYears(65) < DateTime.Now);
var oaps1 = employees.Where(oapCalculator);
var oaps2 = (from employee in employees
where oapCalculator(employee)
select employee);
oaps1.ToList().ForEach(employee => Console.WriteLine(employee.Name));
oaps2.ToList().ForEach(employee => Console.WriteLine(employee.Name));
Console.ReadLine();
}
class Employee
{
public string Name { get; set; }
public int EmployeeCode { get; set; }
public string Department { get; set; }
public DateTime DateOfBirth { get; set; }
public bool CurrentEmployee { get; set; }
}
}
我有几个问题:
据我所知,两个特色的Linq查询都在做同样的事情(黑魔法可能正在进行中)。
由于
答案 0 :(得分:3)
RE
var oaps1 = employees.Where(oapCalculator);
VS
var oaps2 = (from employee in employees
where oapCalculator(employee)
select employee);
轻微之间存在差异,特别是在where oapCalculator(employee)
附近。第二个查询映射到:
var oaps2 = employees.Where(employee => oapCalculator(employee));
所以这是一个额外的委托层,并且由于对变量{{1的封闭',也会导致捕获类的(小)开销每次迭代都会解除引用。但除此之外他们是一样的。特别是,oapCalculator
被轻易删除(根据规范)。
一般情况下,使用任何场景中最清晰的。在这种情况下,如果你经常处理涉及代表或Select
s的场景,你会发现使用.Where
等更容易使用{strong>但。
答案 1 :(得分:2)
我并不是说这是讽刺,但有时候最好自己尝试一下。沿着这些方向,这里有一些工具,以及我自己的一些经验。
1和2 :反汇编并找出答案! :) http://www.red-gate.com/products/reflector/
3 :了解您的应用。这是任何性能决定问题的答案,除非你正在做算法工作(数学证明,大o)。分析工具内置于VS。
4 :您更喜欢哪个?你的同事怎么样?这听起来像一个统计问题,需要进行调查
5 :与4类似,试试看吧!正如您可能已经经历过的那样,向您的同事传授新技术将教会您尽可能多地教他们。
我发现在教授普通代表/ lambda使用方面,我的成功率约为50%。我确保从我的生产测试代码中提出实际的例子,并展示了等效的命令式代码如何有很多重复。
我尝试与我的团队一起浏览免费的SICP视频(在重构方面真是令人大开眼界),我觉得这很难卖。 LISP对大多数程序员来说不是最有吸引力的语言......
http://groups.csail.mit.edu/mac/classes/6.001/abelson-sussman-lectures/
答案 2 :(得分:0)
两个LINQ查询都是等价的。第二个使用语法糖,编译器在编译之前将其转换为类似于第一个查询的表达式。就首选而言,使用对您和您的团队来说更具可读性的内容。