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