【问题标题】:What do they mean when they say LINQ is composable?当他们说 LINQ 是可组合的时,他们是什么意思?
【发布时间】:2009-07-17 21:20:21
【问题描述】:

这是什么意思,为什么(如果有的话)很重要?

【问题讨论】:

    标签: linq


    【解决方案1】:

    这意味着您可以在查询中添加额外的“运算符”。这很重要,因为您可以非常高效地做到这一点。

    例如,假设您有一个返回员工列表(可枚举)的方法:

    var employees = GetEmployees();
    

    以及使用该方法返回所有管理器的另一种方法:

    IEnumerable<Employee> GetManagers()
    {
        return GetEmployees().Where(e => e.IsManager);
    }
    

    您可以调用该函数来获取即将退休的经理并向他们发送电子邮件,如下所示:

    foreach (var manager in GetManagers().Where(m => m.Age >= 65) )
    {
       SendPreRetirementMessage(manager);
    }
    

    小测验:您的员工名单会重复多少次?答案是恰好一次;整个操作仍然只是 O(n)!

    另外,我不需要为此设置单独的方法。我可以在一个地方编写包含这些步骤的查询:

    var retiringManagers = GetEmployees();
    retiringManagers = retiringManagers.Where(e => e.IsManager);
    retiringManagers = retiringManagers.Where(m => m.Age >= 65);
    foreach (var manager in retiringMangers)
    {
        SendPreRetirementMessage();
    }
    

    关于此的一个很酷的事情是,我可以在运行时进行更改,这样我可以在 if 块中包含或不包含合成的一部分,这样使用特定过滤器的决定就在运行时,一切仍然很好。

    【讨论】:

    • 恰好一次的部分是可组合性的回报,嗯?
    • 其中的一部分。剩下的就是您可以采用“GetEmployees()”或“GetManagers()”之类的方法,并以有效的方式将其用作构建(组合)新的、更复杂的查询的构建块。如果没有 linq,您必须从头开始为每种方法创建员工列表。
    【解决方案2】:

    我认为这意味着您可以菊花链查询,像这样

    var peterJacksonsTotalBoxOffice
        = movies.Where(movie => movie.Director == "Peter Jackson")
            .Sum(movie => movie.BoxOffice);
    

    【讨论】:

      猜你喜欢
      • 2011-06-22
      • 1970-01-01
      • 2016-02-12
      • 1970-01-01
      • 1970-01-01
      • 2013-06-17
      • 2020-12-31
      • 2022-10-18
      • 2011-10-18
      相关资源
      最近更新 更多