这两个LINQ查询有什么区别?

时间:2017-01-06 17:16:14

标签: c# linq ienumerable

我有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();

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:1)

这里的一切都没用。

(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转换为另一个表单 你给。  如果sequence包含任何元素,则无参数Any返回true。否则返回false。

答案 2 :(得分:1)

您可能想尝试:

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)提供的不同映射(选择器)和过滤(谓词)函数。