2013-01-20 113 views
8

我目前使用是否有與LINQ的所有方法相反的東西?

a_list.All(item => !(item.field_is_true == true)) 

效果很好,但我想知道是否有一個合適的LINQ方法來完成所有的對立面。

+1

它會被稱爲無? –

+0

@JonathanWood LINQ沒有'None()'方法。 – JLRishe

+2

我知道,但寫一個會很簡單。只需返回一個空集。我的觀點是,不是無所有相反嗎? –

回答

18

All()檢查給定謂詞對所有項目返回true。在框架開發方面,編寫一個獨立的方法檢查給定的Predicate是否爲所有項返回false是沒有意義的,因爲它非常容易「不」謂詞。 但是,您可以編寫自己的擴展方法:

public static bool None<T>(this IEnumerable<T> source, Func<T, bool> predicate) 
{ 
    return !source.Any(predicate); 
} 
+3

你也可以使用'Func '而不是'Predicate ' – SWeko

6

All()完全相反,本質上是None,但由於LINQ沒有None()方法,您可以通過!set.Any()完成相同的結果。

!a_list.Any(item => !(item.matches == true)) 

這將產生true如果沒有中的a_list的項目有一個matches值是不正確的。

這雙重否定是有點混亂,所以要提供一個簡單的例子:

names.All(item => item.StartsWith("R")) 

爲真,如果names開始與R中的項目的所有(因爲你已經知道了)。

!names.Any(item => item.StartsWith("R")) 

如果沒有在names啓動的項目與R.

根據您在下面的評論中,這聽起來是真的喜歡你可能只是在尋找一種方式來完成相同的結果,您的目前的代碼片段,但以不同的方式。這應該提供相同的結果作爲當前的代碼,但沒有!於斷言:

!a_list.Any(item => item.matches == true) 

這可以進一步簡化爲:

!a_list.Any(item => item.matches) 

我想像你可以和簡化,這樣:

a_list.All(item => !item.matches) 

有很少一個很好的理由,明確比較truefalse一個布爾值。

+0

假設'.matches'總是'true',你不會只想要第二個'!',沒有第一個? – TankorSmash

+1

@TankorSmash我不確定。你還沒有完全解釋你想做什麼。我給你的例子完全相反。你想要確定什麼,具體是什麼? – JLRishe

1

而不是否定所有的()條件下,只需將任何()與同謂語使用並進行適當處理返回boolean值。

因此,而不是:

bool conditionDoesntExist = a_list.All(item => !(item.field_is_true == true)); 

你可以有

bool conditionDoesExist = a_list.Any(item => item.field_is_true == true) 

注意的標誌名稱的變化。 (當然,我忽略了像原始謂詞可能被寫爲item => item.field_is_true == false或簡單地item => !item.field_is_true)的語義材料。

如果你想守旗的名字一樣,那麼仍然使用的任何(),但否定它:

bool conditionDoesntExist = !a_list.Any(item => item.field_is_true == true); 
+1

當使用** linq來對象**時,不應該存在性能差異。請參閱[鏈接](http://stackoverflow.com/a/9027666/1219182) –

2

你寫道:

a_list.All(item => !(item.field_is_true == true)) 

就是喜歡這樣做:

a_list.All(item => item.flag== false) // more readable to me... 
     //return true if all of the items have a **flase** value on their flag 

您還可以使用.any()實現相同的結果:

!a_list.Any(item => item.flag==true) 

爲性能自動問題:.ANY() VS 。所有() - 都將具有相同的性能 (使用LINQ到對象時),找到更多的在這裏:LINQ: Not Any vs All Don't

相關問題