【问题标题】:Linq query preferencesLinq 查询首选项
【发布时间】:2010-07-31 08:41:57
【问题描述】:

学习一点关于 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. 在一个害怕 luddites 的 lambda 部门,是否值得冒险并教他们或使用 SQL 式语法?

谢谢

【问题讨论】:

  • 由于您在这两种方法中都使用了 lambda 表达式,我不确定您的问题 4 和 5 的意思。您可能会在没有 lambda 的情况下重写第二个版本,我怀疑很多人会认为它会更干净、更具可读性。

标签: c# .net linq comparison performance


【解决方案1】:

回复

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 被简单地删除(根据规范)。

一般来说,在任何情况下都使用最清晰的那个。在这种情况下,两者都可以,但是如果您经常处理涉及委托或Expressions 的场景,您会发现使用.Where 等会更容易。

【讨论】:

    【解决方案2】:

    我并不是要讽刺,但有时最好自己尝试一下。沿着这些思路,这里有一些工具,以及我自己的一些经验。

    1和2:拆机一探究竟! :) http://www.red-gate.com/products/reflector/

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

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

    5:和4类似,试一试就知道了!正如您所经历的那样,向您的同事宣传新技术会教给您和教给他们的一样多。

    我发现我在教授一般委托/lambda 用法方面的成功率约为 50%。我确保从我的生产测试代码中拿出实际示例,并展示了等效的命令式代码如何有很多重复。

    我尝试与我的团队一起浏览免费的 SICP 视频(对于重构来说真是大开眼界),我发现它很难卖。 LISP 对大多数程序员来说并不是最有吸引力的语言...

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

    【讨论】:

    • 第 5 点很重要,教授和解释一个概念是迄今为止学习某些东西并将其铭记于心的最佳方式!
    • 不错,我可能会使用有问题的代码来确定公司中有多少 OAP 年龄的员工。他们应该记住...
    【解决方案3】:

    两个 LINQ 查询是等效的。第二个使用语法糖,编译器在编译之前将其转换为类似于您的第一个查询的表达式。至于首选什么,请使用对您和您的团队来说更易读的任何内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-19
      • 2019-04-23
      • 2014-05-10
      • 1970-01-01
      相关资源
      最近更新 更多