2017-03-08 48 views
1

我有一個使用列表上的「任何」方法的函數。如何重構這個Linq函數?

List<String> list = Factory.ReturnList(); //Returns a list of all countries in Europe 

我需要驗證列表中包含像部分字符串 「(DE)」 和 「(FR)」,...

Assert.Equal(list.Any(item=> item.Contains("(DE)")), true); Assert.Equal(list.Any(item=> item.Contains("(FR)")), true); Assert.Equal(list.Any(item=> item.Contains("(BE)")), true); Assert.Equal(list.Any(item=> item.Contains("(NL)")), true);

現在我想將它寫爲一個函數。我見過別人用這樣的代碼:

Func<IWebElement, bool> condition = item => item.Text == "something"; 
Assert.Equal(list.Any(condition), true); 

我已經嘗試以下,但沒有奏效:

Func<List<String>, bool> condition = list.Any(x => x.Contains(input)); 

由於:

Cannot implicitly convert type 'bool' to 'System.Func<System.Collections.Generic.List<string>, bool>' 

我怎樣才能在我的例子中這樣做?

「輸入」需要一個參數/變量,這樣的函數功能可以用不同的參數

回答

0

如果你只是想要一個lambda表達式,使用被調用:

Func<List<String>, bool> condition = (list,input) => list.Any(x => x.Contains(input)); 
+0

「輸入」需要一個參數/變量,這樣可以Func鍵用不同的參數雖然被調用....你的解決方案不起作用,感謝.... –

4

您正在調用該方法並嘗試將其分配給您的Func,因爲您已經調用它,返回bool,這當然不起作用。

相反,封裝兩個輸入參數並更新Func簽名以符合您的意圖。

Func<List<String>, string, bool> condition = 
    (list, input) => list.Any(x => x.Contains(input)); 

然後,您可以調用你的函數功能,像這樣:

Assert.Equal(condition(new List<string>(), ""), true); 

這給你的靈活性和可重用程度最高,因爲條件是恆定的,但參數可以改變。

+0

謝謝您的回答。我寫了這個,它的工作原理:'Func condition = x => x.Contains(「(EN)」); Assert.Equal(list.Any(condition),true);'但我想讓「(EN」)像變量一樣,我可以這樣做嗎? –

+0

@HappyBird非常歡迎!如果您在計時器啓動後將我的答案標記爲可接受,那麼我們將非常感謝並將其他人指向正確的方向。 –

0

如何將這些字符串放入數組?

string[] countries = { "DE", "FR", "BE", "NL" }; 

result = from item in list 
       where countries.Any(val => item.Contains(val)) 
       select item; 
+0

'輸入'需要是一個參數/變量,所以Func可以用不同的參數調用....你的解決方案不起作用,謝謝...... –