C# 是否有一个“哑”字;“全部”;在linq中,评估所有元素?

C# 是否有一个“哑”字;“全部”;在linq中,评估所有元素?,c#,linq,C#,Linq,就像运算符“&”将执行第二个条件一样,即使第一个条件为false, 我在为“所有”寻找同样的东西。我希望得到“全部”的结果,但也希望对每个元素进行评估。在我的例子中,我称之为哑巴 这是一个我为什么想要这个的例子 main { Object[] array = InitSomeArray(); AreObjectValid = array.dumbAll(o => Validate(o)); //other stuff with AreObjectValid } pri

就像运算符“&”将执行第二个条件一样,即使第一个条件为false, 我在为“所有”寻找同样的东西。我希望得到“全部”的结果,但也希望对每个元素进行评估。在我的例子中,我称之为哑巴

这是一个我为什么想要这个的例子

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(…我搞错了…)你不需要在这里创建lambda
Validate
可以作为方法组传递。@Asad干杯,这是相对于聚合版本的一个优势。您不需要在此处创建lambda
Validate
可以作为方法组传递。@Asad干杯,这是相对于聚合版本的一个优势。