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);
}

(或者,替换PredicateFunc<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 回答