【问题标题】:What is the difference between these 2 LINQ queries?这两个 LINQ 查询有什么区别?
【发布时间】:2017-01-06 17:16:13
【问题描述】:

我有 2 个 LINQ 查询,一个返回我期望的结果,另一个没有,我试图了解原因。我试图从 Config 中的所有节点中找出是否有一个名为“TEST”的节点,并且其 Selected 属性为 True。

查询 1 - 返回正确的内容具有 Any() 内的条件:

var res1 =
(from config in _config.CurrentSettings.Config let name = config.name select config).Any(
    config => config.name.Equals("TEST") && config.selected == true);

查询 2 失败,在 Select 内有条件:

(_config.CurrentSettings.Config.Select(config => config.name.Equals("TEST") && config.selected))
.Any();

【问题讨论】:

  • Select 返回一个IEnumerable<bool> 你需要使用Where 来过滤输入序列。
  • let name = config.name 在做什么?它显然没用
  • 任何返回布尔值,选择返回数据

标签: c# linq ienumerable


【解决方案1】:

LINQ 的Any() 没有条件意味着“至少有一行”。第一个查询指定了一个条件,使其“至少有一行符合条件”。

要使第二个查询等同于第一个查询,请使用Any(flag => flag),或将Select 替换为Where。这两个选项都不如最初的Any,里面有条件,因为它们不那么可读。

【讨论】:

    【解决方案2】:

    这里的一切都是无用的。

    (from config in _config.CurrentSettings.Config let name = config.name select config)
    

    你可以把它缩小到这个

    _config.CurrentSettings.Config.Any(config => config.name.Equals("TEST") && config.selected == true);
    

    这将与您的第一个代码块执行相同的操作。

    Select 方法使用选择器将 ienumerable 转换为另一种形式 你给。 如果序列包含任何元素,则无参数 Any 返回 true。否则返回 false。

    【讨论】:

      【解决方案3】:

      你不妨试试:

      var isTestSelected = _config.CurrentSettings.Config.Any(config => config.name.Equals("TEST") && config.selected);
      

      查看SelectAny 方法的文档,可能会提供一些见解。

      如果您查看每个链接的“参数”部分,您会发现虽然这两种方法都接受 Func,但它们的用法实际上是不同的。

      任何

      谓词 类型:System.Func<TSource, Boolean> 一个函数来测试每个 条件的元素。

      选择

      选择器 类型:System.Func<TSource, TResult> 转换函数 适用于每个元素。

      因此,在您的 Query1 示例中,您正在对集合中的每个项目应用转换(或映射),它声明了一个本地名称变量 let name = config.name(未使用),然后按原样返回对象(不实际转换任何内容)select config。这段代码是多余的,可以去掉。

      您的Any() lambda 通过过滤与您的 lambda 谓词不匹配的项目来完成 Query1 中的所有工作。

      在 Query2 中,您将过滤 lambda 传递给转换函数,然后使用不带过滤器的过滤函数。

      有许多不同的方法可以使用 Linq 获得您想要的结果。我鼓励您查看框架 (link) 提供的不同映射(选择器)和过滤(谓词)功能。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-19
        • 1970-01-01
        • 2016-05-06
        • 2017-04-19
        • 2013-04-11
        • 2012-04-19
        相关资源
        最近更新 更多