C# 是否有一个“哑”字;“全部”;在linq中,评估所有元素?
就像运算符“&”将执行第二个条件一样,即使第一个条件为false, 我在为“所有”寻找同样的东西。我希望得到“全部”的结果,但也希望对每个元素进行评估。在我的例子中,我称之为哑巴 这是一个我为什么想要这个的例子C# 是否有一个“哑”字;“全部”;在linq中,评估所有元素?,c#,linq,C#,Linq,就像运算符“&”将执行第二个条件一样,即使第一个条件为false, 我在为“所有”寻找同样的东西。我希望得到“全部”的结果,但也希望对每个元素进行评估。在我的例子中,我称之为哑巴 这是一个我为什么想要这个的例子 main { Object[] array = InitSomeArray(); AreObjectValid = array.dumbAll(o => Validate(o)); //other stuff with AreObjectValid } pri
main
{
Object[] array = InitSomeArray();
AreObjectValid = array.dumbAll(o => Validate(o));
//other stuff with AreObjectValid
}
private bool Validate(object o)
{
bool IsValid = IsPositiveNumeric(o.ToString());
HighLighInvalidObjectWhenInvalid(o, IsInvalid: !IsValid);
return IsValid;
}
linq中存在这样的东西吗?注意:我已经知道如何在没有链接的情况下处理此问题。不太清楚,但通过聚合结果可以实现此目的
var allValid = array.Aggregate(true, (acc, o) => acc & Validate(o));
不太可能,但通过聚合结果可以实现这一点
var allValid = array.Aggregate(true, (acc, o) => acc & Validate(o));
我不喜欢这个
聚合
答案(以及计数
答案,只要你有一个数组),但这里:
AreObjectValid = array.Select(o => Validate(o)).ToArray().All(b => b);
或者,正如所指出的
AreObjectValid = array.Select(Validate).ToArray().All(b => b);
我不喜欢这个
聚合
答案(以及计数
答案,只要你有一个数组),但这里:
AreObjectValid = array.Select(o => Validate(o)).ToArray().All(b => b);
或者,正如所指出的
AreObjectValid = array.Select(Validate).ToArray().All(b => b);
您可以使用其他查询运算符来实现相同的功能。一个例子是计算有多少对象满足该条件
Object[] array = InitSomeArray();
var count = array.Count(o => Validate(o));
var areObjectsValid = count == array.Length;
您可以使用其他查询运算符来实现相同的功能。一个例子是计算有多少对象满足该条件
Object[] array = InitSomeArray();
var count = array.Count(o => Validate(o));
var areObjectsValid = count == array.Length;
这里有很多LINQ的答案,但因为我认为LINQ转换在理想情况下应该是无副作用的,所以这里有一种方法,它使用了
foreach
,并且不会牺牲太多的简洁性
bool all = true;
foreach(var o in array)
all &= Validate(o);
这会对每个值进行
验证
,最后如果任何值验证失败,则所有的都将为false。这里有很多LINQ答案,但因为我认为LINQ转换在理想情况下应该没有副作用,这里有一种方法,它使用了一个foreach
,并且不会牺牲太多的简洁性
bool all = true;
foreach(var o in array)
all &= Validate(o);
这将为每个值计算Validate
,最后,如果任何值未通过验证,则all
将为false。听起来像是您想要一个foreach循环,而不是all
@Asas Shh,LINQ是未来。您需要这样做的事实意味着验证会产生副作用,这是一个很大的危险信号,表明这里发生了一些非常错误的事情。我会小心使用Linq的副作用。必须对Linq方法进行延迟求值,因此实际上可能会发现函数根本没有被调用(或多次调用),这取决于使用结果的方式。只需使用foreach循环。最后,从方法“Validate”中删除了方法“HighLigh”。这允许我删除“HighLigh”方法中的参数“IsInvalid”。然后,foreach(数组中的var obj,其中(o=Validate(o)))HighLigh(obj);它似乎不存在是有原因的。为了防止像我即将做的那样做坏事。听起来你想要一个foreach循环,而不是All
@Asas Shh,LINQ是未来。你需要这样做,这意味着验证会导致副作用,这是一个相当大的危险信号,表明这里正在发生一些非常错误的事情。我会小心使用LINQ来产生副作用。必须对Linq方法进行延迟求值,因此实际上可能会发现函数根本没有被调用(或多次调用),这取决于使用结果的方式。只需使用foreach循环。最后,从方法“Validate”中删除了方法“HighLigh”。这允许我删除“HighLigh”方法中的参数“IsInvalid”。然后,foreach(数组中的var obj,其中(o=Validate(o)))HighLigh(obj);它似乎不存在是有原因的。为了防止做我想做的坏事。该死,你赢了我:D(…我搞错了…)该死,你赢了我:D(…我搞错了…)你不需要在这里创建lambdaValidate
可以作为方法组传递。@Asad干杯,这是相对于聚合版本的一个优势。您不需要在此处创建lambdaValidate
可以作为方法组传递。@Asad干杯,这是相对于聚合版本的一个优势。