私は現在使用しています
a_list.All(item => !(item.field_is_true == true))
これはうまく機能しますが、すべての逆を行うための適切なLINQメソッドがあったかどうかを知りたいです。
All()は、指定された述語がすべての項目に対してtrueを返すことを確認します。フレームワークの開発に関しては、述語を「しない」のは簡単なので、特定の述語がすべての項目に対してfalseを返すことをチェックする個別のメソッドを作成することは意味がありません。ただし、独自の拡張メソッドを作成できます。
public static bool None<T>(this IEnumerable<T> source, Func<T, bool> predicate)
{
return !source.Any(predicate);
}
の正反対All()
は基本的None
にですが、LINQにはNone()
メソッドがないため、を使用して同じ結果を得ることができます!set.Any()
。
!a_list.Any(item => item.matches == true)
これはtrue
、a_listのどの項目にもmatches
trueの値がない場合に生成されます。
もう一つの例:
names.All(item => item.StartsWith("R"))
すべての項目がRで始まる場合はtrueですnames
(すでにご存知のとおり)。
!names.Any(item => item.StartsWith("R"))
Rで始まる項目がない場合はtrueです。names
以下のコメントに基づくと、現在のコードスニペットと同じ結果を達成する方法を探しているようですが、方法は異なります。これにより、現在のコードと同じ結果が得られますが!
、述語にが含まれていません。
!a_list.Any(item => item.matches == true)
これはさらに単純化して次のようになります。
!a_list.Any(item => item.matches)
私はあなたもこれに単純化できると思います:
a_list.All(item => !item.matches)
true
ブール値をまたはと明示的に比較する正当な理由はめったにありませんfalse
。
あなたが書いた:
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() と.all() - どちらも同じパフォーマンス になります(オブジェクトへのlinqが使用されている場合)、詳細はこちらをご覧ください:LINQ:Not Any vs All Do n't
All()条件を否定するのではなく、同じ述語でAny()を使用し、返されたブール値を適切に処理します。
したがって、ではなく:
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
)。
フラグ名を同じに保ちたい場合は、Any()を使用しますが、それを否定します。
bool conditionDoesntExist = !a_list.Any(item => item.field_is_true == true);
全て
a_list.All(item => item.condition)
いくつかの
a_list.Any(item => item.condition)
すべてではない
!a_list.All(item => item.condition)
また:
a_list.Any(item => !(item.condition))
なし
!a_list.Any(item => item.condition)
また
a_list.All(item => !(item.condition))