2015-05-22 37 views
1

就像操作員「&」將執行第二個條件,即使第一個條件爲假, 我正在爲「全部」尋找相同的內容。我想要「全部」的結果,但也希望評估每個元素。在我的例子中,我稱之爲啞巴。linq中有沒有一個愚蠢的「全部」評估所有元素?

這是我爲什麼要這樣的一個例子。

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

聽起來像是你想要一個foreach循環而不是'All' –

+0

@Asas Shh,LINQ是未來。 – Rawling

+2

事實上,你需要這樣做,這意味着驗證是造成副作用,是一個非常大的紅旗,這裏發生了非常錯誤的事情。 – Servy

回答

4

不是,但是您可以實現這種彙總結果。

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

該死的,你打敗了我:D(...我弄錯了......) – Rawling

2

我喜歡這個比Aggregate回答以下(和Count答案,只要你有一個數組),但在這裏:

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

,或者爲Asad指出,

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

你不需要在這裏創建一個lambda。 「驗證」可以作爲方法組傳遞。 –

+0

@Asad Cheers,這是對Aggregate版本的一個優勢。 – Rawling

4

您可以使用其他查詢運算符來實現相同。一個例子是計算有多少物體滿足條件。

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

有一堆LINQ的答案在這裏,但因爲我相信LINQ轉變理論上應無副作用,這是一個使用一個foreach並沒有真正犧牲太多簡潔的方法。

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

此評估Validate每個值,並在結束all會出現假如果任何值驗證失敗。