c# - Linq 查询首选项

标签 c# .net linq comparison performance

了解一些有关 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 的勒德分子的部门,是否值得冒险教导他们或使用 SQL 式语法?

谢谢

最佳答案

回复

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

因此,这是委托(delegate)的额外层,并且由于变量 oapCalculator 的闭包,还会产生捕获类的(小)开销。 ,以及每次迭代对此的取消引用。但除此之外它们是相同的。特别是Select被轻松删除(根据规范)。

一般来说,在任何场景中都使用最清晰的那个。在这种情况下,两者似乎都不错,但是您会发现使用 .Where 更容易等等,如果您经常处理涉及代表的场景或 Expression s。

关于c# - Linq 查询首选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3377417/

相关文章:

c# - 制作类型集合并对其进行检查的最佳方法

c# - XXX.exe 中发生类型为 'System.ExecutionEngineException' 的未处理异常

c# - 如何处理 "Unset"事件

线宽的 C# 编码约定

c# - Null 合并在 LINQ 查询中不起作用

c# - C# 编译器如何优化代码片段?

c# - LINQ - 获取列表中列表中的所有项目?

.net - 限制程序集执行的 cpu 周期数

c# - 具有匿名类型和用户定义类型的 LINQ 选择查询

c# - 如何在添加新行之前使所有列都允许为空?