Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 这两个LINQ查询之间有什么区别?_C#_Linq_Ienumerable - Fatal编程技术网

C# 这两个LINQ查询之间有什么区别?

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

我有两个LINQ查询,一个返回我期望的结果,另一个不返回,我正在试图理解原因。我试图弄清楚,在Config中的所有节点中,是否有一个名为“TEST”的节点,并且它的Selected属性为True

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

查询2失败,条件在Select中:

(_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转换为另一种形式 你给。 如果序列包含任何元素,则参数less
Any
返回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);