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从阵列中任意取2或更多_C#_Linq - Fatal编程技术网

C#LINQ从阵列中任意取2或更多

C#LINQ从阵列中任意取2或更多,c#,linq,C#,Linq,我一直在试图找出如何使从数组中提取2个或更多字符的any方法变为true。到目前为止,它只需在passwordSec中找到一个(即密码字符串)。Any明确表示,如果任何项与提供的谓词匹配,它将返回true。您要检查的是有多少项与提供的谓词匹配。因此,请使用Count var values = new[] { "!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "?" }; if (values.Any(s => passwordSe

我一直在试图找出如何使从数组中提取2个或更多字符的any方法变为true。到目前为止,它只需在passwordSec中找到一个(即密码字符串)。

Any
明确表示,如果任何项与提供的谓词匹配,它将返回true。您要检查的是有多少项与提供的谓词匹配。因此,请使用
Count

var values = new[] { "!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "?" };

if (values.Any(s => passwordSec.Contains(s)) && passwordSec.Length > 7)
或者,如果您想检查它们是否使用了两个不同的
值项
,您可以使用
Intersect
,这将丢弃重复项:

if (values.Count(s => passwordSec.Contains(s)) >= 2 && passwordSec.Length > 7)

对于短序列,
Count
将充分发挥作用(参见Rob的回答)。但是,它将枚举整个序列以得到答案。当
包含数千项,其中数百项可以匹配时,这是次优的

对于较长的序列,当您希望在找到
N
-th项后立即进行短路比较时,您可以跳过
N-1
项,然后对结果使用
Any()

if (values.Intersect(passwordSec).Count() >= 2 && passwordSec.Length > 7)
const int targetCount = 2;
if (values.Where(s => passwordSec.Contains(s)).Skip(targetCount-1).Any() && passwordSec.Length > 7) {
    ...
}