2014-12-05 67 views
-1

我這裏有下面的例子應該過濾的字符串項的列表代表一個具有多個方法

List<string> input = new List<string>() { "cat", "toast", "house" }; 
Func<string, bool> filter = null; 
filter += x => x.EndsWith("t"); 
filter += y => y.Contains('o'); 
List<string> output = input.Where(filter).ToList(); //toast, house 

我希望,因爲它以T結尾,包含○結果是「麪包」。但結果是敬酒,家 - 我的錯誤是什麼?

+0

你不應該使用''&&? – 2014-12-05 14:02:28

回答

1

多播委託的返回值是調用列表中最後一個方法的返回值。所以你的func只檢查給定的參數是否包含o而忽略EndsWith的結果。

C# 5.0 Specification, §15.4 Delegate Invocations

調用委託實例的調用其列表包含通過調用每個方法中調用列表,同步地,爲了多個條目進行陳述。 [...] 如果委託調用包含輸出參數或返回值,則它們的最終值將來自調用最後一個委託列表。

如果兩個條件想檢查使用&&

filter = x => x.EndsWith("t") && x.Contains('o'); 
+0

所以在我的情況下,第一種方法被調用,但被忽略?是的,我知道「&&」 - 解決方案,但我想用多種方法/ lambda表達式來解決這個問題 – fubo 2014-12-05 14:09:24

+0

@fubo yes。每個值都會調用兩種方法,但只返回包含第二個的結果。 – 2014-12-05 14:10:01

+0

這是討厭的,但正確的答案:)謝謝 – fubo 2014-12-05 14:26:57

0

過濾Func鍵返回最後執行的方法使用該

 List<string> input = new List<string>() { "cat", "toast", "house" }; 
     Func<string, bool> filter = null; 
     filter += x => x.EndsWith("t") && x.Contains('o');