代码之家  ›  专栏  ›  技术社区  ›  fletcher

Linq查询首选项

  •  2
  • fletcher  · 技术社区  · 14 年前

    了解一下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. 监视Linq查询效率的最佳方法是什么?性能计时器还是什么内置的?
    3. lambda表达式是首选方法吗,因为它最简洁?

    谢谢

    3 回复  |  直到 14 年前
        1
  •  3
  •   Marc Gravell    14 年前

    重新

    var oaps1 = employees.Where(oapCalculator);
    

    var oaps2 = (from employee in employees
                 where oapCalculator(employee)
                 select employee);
    

    有一个 差异,特别是 where oapCalculator(employee) . 第二个查询映射到:

    var oaps2 = employees.Where(employee => oapCalculator(employee));
    

    所以这是一个 代表层,并将 oapCalculator ,以及每次迭代对此的取消引用。但在其他方面它们是一样的。特别是 Select 被琐碎地移除(根据规范)。

    一般来说,使用任何场景中最清晰的一个。在这种情况下,任何一个看起来都很好, 但是 你会发现它更容易使用 .Where 如果你经常处理涉及代表或 Expression s。

        2
  •  2
  •   Merlyn Morgan-Graham    14 年前

    :分解并找出答案!:) http://www.red-gate.com/products/reflector/

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

    4 :您喜欢哪一种?你的同事呢?这听起来像是一个统计问题,需要进行调查

    5 :类似于4,请尝试并找出答案!正如你可能经历过的那样,向你的同事传播新技术将教会你和教会他们一样多的东西。

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

    我试着和我的团队一起浏览免费的SICP视频(在重构方面真的让人大开眼界),我发现这是一个很难推销的东西。LISP并不是大多数程序员最喜欢的语言。。。

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

        3
  •  0
  •   Darin Dimitrov    14 年前