有一个愚蠢的"所有"在linq评估所有元素?

时间:2015-05-22 20:38:00

标签: c# linq

就像运营商"&"即使第一个是假的,也会执行第二个条件, 我为#34; All"寻找同样的事情。我想要" All"的结果但也希望评估每个元素。在我的例子中,我称之为愚蠢。

以下是我想要这个的原因示例。

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中是否存在这样的事情?
注意:我已经知道如何在没有链接的情况下处理这个问题。

4 个答案:

答案 0 :(得分:5)

您可以使用其他查询运算符来实现相同的功能。一个例子是计算满足条件的对象数量。

Object[] array = InitSomeArray();
var count = array.Count(o => Validate(o));
var areObjectsValid = count == array.Length;

答案 1 :(得分:4)

不是真的,但你可以实现这一目标。

var allValid = array.Aggregate(true, (acc, o) => acc & Validate(o));

答案 2 :(得分:2)

我喜欢这个,而不是Aggregate答案(和Count答案,只要你有一个数组),但在这里:

AreObjectValid = array.Select(o => Validate(o)).ToArray().All(b => b);

或,正如Asad指出的那样,

AreObjectValid = array.Select(Validate).ToArray().All(b => b);

答案 3 :(得分:2)

这里有一堆LINQ答案,但是因为我认为LINQ转换理想情况下应该是无副作用的,所以这里的方法使用foreach并且不会真正牺牲太简洁了。

bool all = true;
foreach(var o in array) 
    all &= Validate(o);

这会为每个值评估Validate,如果任何值未通过验证,那么all将为false。