2010-07-31 161 views
2

了解一下Linq。 我有以下代码: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查询正在做同样的事情(黑魔法可能正在进行)。

  1. 它们都被编译到相同的IL?
  2. 如果不是,为什么以及哪个数据量最大时效率最高?
  3. 什么是监测Linq查询效率的最佳方法?性能计时器或内置的东西?
  4. lambda表达式是首选方法,因为它是最简洁的?
  5. 在lambda担心luddites的一个部门中,值得冒险和教导他们或使用SQL-esque语法吗?

感谢

+0

由于您使用这两种方法的lambda表达式,我不知道您的问题4和5得到什么。您可能可以重写第二个版本,而不使用lambda,我怀疑很多人会认为它会更干净,更易读。 – 2010-07-31 08:51:11

回答

3

重新

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

因此这是一个额外层代表的,并且将招致捕获级的(小)的开销,由于封闭在所述可变oapCalculator,以及每次迭代的解除引用。但是否则它们是一样的。特别是,Select被平凡地删除(符合规范)。

一般情况下,在任何情况下使用哪一个最清楚。在这种情况下,或者看起来不错,但是如果您定期处理涉及代表或Expression的情况,您会发现使用.Where等易于使用。

0

两个LINQ查询是等效的。第二个使用语法糖,编译器在编译之前转换为类似于第一个查询的表达式。至于什么是首选,使用任何似乎更可读的你和你的团队。

2

我不认为这是讽刺,但有时候最好自己尝试一下。沿着这些路线,这里有一些工具和一些我自己的经验。

1和2:拆解并找出! :) http://www.red-gate.com/products/reflector/

:配置您的应用程序。这是任何性能决定问题的答案,除非你在做算法工作(数学证明,大-o)。剖析工具内置于VS.

:你更喜欢哪一个?你的同事呢?这听起来像一个统计问题,这将需要一个调查

:类似于4,尝试它并找出!正如你可能已经经历的那样,向你的同事传播新技术将尽可能地教会你。

我发现我已经有约50%的成功率W /教授一般代表/ lambda的使用。我一定会从我的生产测试代码中拿出实际的例子,并且展示了等价的命令式代码是如何重复的。

我试着通过免费的SICP视频与我的团队(对重构真的很开眼),我发现它很难卖。 LISP是不是最有吸引力的语言向广大程序员的...

http://groups.csail.mit.edu/mac/classes/6.001/abelson-sussman-lectures/

+0

第5点是一个重要的点,教授和解释一个概念是迄今为止最好的方式来学习和巩固你的思想! – NibblyPig 2010-07-31 09:16:12

+0

很明显,我可能会使用有问题的代码来确定公司中有多少OAP年龄的员工。他们应该记住...... – fletcher 2010-07-31 09:32:08