如何重构这个Linq函数?

时间:2017-03-08 17:23:06

标签: c# linq

我有一个使用" Any"列表上的方法。

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

我需要验证列表是否包含部分字符串,如&#34;(DE)&#34;和&#34;(FR)&#34;,...

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>'

我怎么能在我的例子中这样做?

&#39;输入&#39;需要是一个参数/变量,因此可以使用不同的参数调用Func

3 个答案:

答案 0 :(得分:4)

您当前正在调用该方法并尝试将其分配给您的Func,这当然不起作用,因为您已经调用它,返回bool。

相反,封装两个输入参数并更新Func签名以符合您的意图。

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

然后您可以像这样调用您的Func:

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

由于条件不变,这为您提供了最高程度的灵活性和可重用性,但参数可能会发生变化。

答案 1 :(得分:0)

如果您只想要一个lambda表达式,请使用:

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

答案 2 :(得分:0)

如何将这些字符串放入数组中?

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

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