2013-08-07 74 views
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); 
+0

它看起來像你不希望它'無限',所以當你想停止/打破它? –

+2

否定它意味着什麼? – BoltClock

+0

@KingKing我不明白你的意思
@BoltClock在上面的例子中,選擇器應該和'p =>!p.IsNew'一樣。 – Aximili

回答

7

你可以用一個輔助方法做到這一點:

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

(或與Func<T, bool>取代Predicate)。

然後:

selector = selector.Negate(); 

你的堆棧溢出的問題是很明顯的;你自己定義selector 。輔助方法避免了這個問題。

:也就是說,這顯然會導致堆棧溢出太:

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

信不信由你,你正在做同樣的事情。

0

您還可以使用臨時FUNC:

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

這樣selector不再是指本身。