C# 这两个LINQ查询之间有什么区别?
我有两个LINQ查询,一个返回我期望的结果,另一个不返回,我正在试图理解原因。我试图弄清楚,在Config中的所有节点中,是否有一个名为“TEST”的节点,并且它的Selected属性为True 查询1-返回正确内容的查询在Any()中具有条件: 查询2失败,条件在Select中:C# 这两个LINQ查询之间有什么区别?,c#,linq,ienumerable,C#,Linq,Ienumerable,我有两个LINQ查询,一个返回我期望的结果,另一个不返回,我正在试图理解原因。我试图弄清楚,在Config中的所有节点中,是否有一个名为“TEST”的节点,并且它的Selected属性为True 查询1-返回正确内容的查询在Any()中具有条件: 查询2失败,条件在Select中: (_config.CurrentSettings.Config.Select(config => config.name.Equals("TEST") && config.selected))
(_config.CurrentSettings.Config.Select(config => config.name.Equals("TEST") && config.selected))
.Any();
没有条件的LINQ的Any()
表示“至少有一行”。第一个查询指定一个条件,使其“至少有一行与该条件匹配”
要使第二个查询等同于第一个查询,请使用
Any(flag=>flag)
,或将选择
替换为其中
。这两个选项都不如初始的Any
,条件在里面,因为它们不可读。这里的所有内容都是无用的
(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转换为另一种形式
你给。
如果序列包含任何元素,则参数lessAny
返回true。否则返回false。您可能需要尝试:
var isTestSelected = _config.CurrentSettings.Config.Any(config => config.name.Equals("TEST") && config.selected);
查看文档中的方法和步骤,可以提供一些见解
如果您查看这些链接中每个链接的参数部分,您将看到,虽然这两个方法都接受Func
,但它们的用法实际上是不同的
任何
谓词
键入:System.Func
用于测试每个函数的函数
条件的元素
选择
选择器
类型:System.Func
将函数转换为
应用于每个元素
因此,在Query1示例中,您将对集合中的每个项应用转换(或映射),这将声明一个局部名称变量
让name=config.name
(未使用),然后按原样返回对象(不实际转换任何内容)选择config
。这段代码是多余的,可以删除
您的Any()
lambda正在过滤与lambda谓词不匹配的项,从而完成Query1中的所有工作
在Query2中,将过滤lambda传递给变换函数,然后使用不带过滤器的过滤函数
有许多不同的方法可以使用Linq获得您想要的结果。我鼓励您查看框架()提供的不同映射(选择器)和过滤(谓词)函数。
Select
返回一个IEnumerable
您需要使用Where
来过滤输入序列。let name=config.name
在做什么?它可能会返回一个波林,选择返回数据
var isTestSelected = _config.CurrentSettings.Config.Any(config => config.name.Equals("TEST") && config.selected);