4

これは私のコードで、簡単にするために大幅に省略されています

Func<Product, bool> selector;
...
selector = p => p.IsNew;
...
if(negative) // not selector
  selector = x => !selector(x); // This is wrong (causes infinite loop)
  // How do you do negate it? The result should be p => !p.IsNew

...
IEnumerable<Product> products = MyContext.Products.Where(selector);
4

2 に答える 2

7

ヘルパー メソッドを使用してこれを行うことができます。

public static Predicate<T> Negate<T>(this Predicate<T> predicate) {
    return t => !predicate(t);
}

(または、 に置き換えPredicateますFunc<T, bool>)。

それで:

selector = selector.Negate();

スタック オーバーフローの問題は明らかです。selectorそれ自体の観点から定義しています1。ヘルパー メソッドはその問題を回避します。

1 : つまり、明らかにスタック オーバーフローも発生します。

public bool M() { return !M(); }

信じられないかもしれませんが、あなたはまったく同じことをしています。

于 2013-08-07T02:27:34.963 に答える
0

一時的な Func を使用することもできます。

if(negative)
{
    Func<Product, bool> tempSelector = selector;
    selector = x => !tempSelector(x);
}

この方法selectorは、もはやそれ自体を参照しません。

于 2013-08-07T03:00:44.797 に答える