39

コレクションに指定された述語の一致がないかどうかを効果的にチェックする LINQ 拡張メソッドが不足していると感じる状況に遭遇しました。AnyとがありますがAll、たとえば次のコードを使用するとします。

if (Objects.All(u => u.Distance <= 0))

コレクション内のすべてのオブジェクトが 0 ヤード以下離れている場合、これは true を返します。

if (Objects.Any(u => u.Distance <= 0))

これは、コレクション内に自分から 0 ヤード以内のオブジェクトが少なくとも 1 つある場合に true を返します。

これまでのところ、これらの方法はどちらも理にかなっており、構文も理にかなっています。ここで、距離が 0 以下のオブジェクトが存在しないかどうかを確認したい場合は、Allメソッド内の述語を>= 0代わりに<= 0or を呼び出す必要!All()があり、場合によってはコードが非常に読みにくくなります。

Collection.None(u => u.Distance <= 0)コレクション内に 0 ヤード以下のオブジェクトがないかどうかを効果的にチェックする方法はありませんか? それは実際の問題というよりも構文糖衣ですが、私はそれが欠けていると感じています。

4

3 に答える 3

44

Noneは と同じな!Anyので、次のように独自の拡張メソッドを定義できます。

public static class EnumerableExtensions
{
    public static bool None<TSource>(this IEnumerable<TSource> source,
                                     Func<TSource, bool> predicate)
    {
        return !source.Any(predicate);
    }
}
于 2013-10-12T19:14:12.890 に答える
6

自分で書くことができますExtension Method

public static bool None(this IEnumerable<T> collection, Func<T, bool> predicate)
{
  return collection.All(p=>predicate(p)==false);
}

またはIQueryable<T>同様に

public static bool None(this IQueryable<T> collection, Expression<Func<TSource, bool>> predicate)
{
  return collection.All(p=> predicate(p)==false);
}
于 2013-10-12T19:15:57.963 に答える