用于比较string []是否包含给定字符串的lambda表达式

时间:2014-05-15 21:25:44

标签: c# arrays linq expression

我的项目工作正常,直到我不得不考虑一系列字符串而不只是一个...我不知道如何解决这个问题。 Country是此方法所在的当前类的属性。它曾经是一个字符串,但现在是一个数组。

最初它看起来像这样:

private Expression<Func<Payment, bool>> CountryMatches()
{
   if (Country.Length < 1) return Skip;
   return payment => payment.Country.ToLower().Contains(Country.ToLower());
}

我无法弄清楚如何设置它,以便Country中的任何字符串匹配payment.Country ...当然这会传回一个表达式。 ..这是我对如何做我需要做的最好的猜测(但显然不正确):

private Expression<Func<Payment, bool>> CountryMatches()
{
   if (Country.Length < 1) return Skip;
   return payment => payment.Country.ToLower() == Country.Any().ToLower();
}

2 个答案:

答案 0 :(得分:6)

您希望针对Country检查payment.Country的所有内容,如下所示:

return payment => Country.Any(
    c => payment.Country.ToLower().Contains(c.ToLower()));

也就是说,检查一个字符串是否是另一个字符串的子字符串是一种相当糟糕的方法,主要是因为它通过一次又一次地转换为小写来完成大量不必要的工作。这是a better way来做的:

return payment => Country.Any(
    c => payment.Country.IndexOf(c, StringComparison.OrdinalIgnoreCase) >= 0);

答案 1 :(得分:2)

.Any取一个lambda,可以进行比较。上面的代码确定它返回一些对比时等于true的对象,但Any返回一个简单的bool。因此,试试

return payment =>
    Country.Any(c =>
        string..Equals(payment.Country, c, StringComparison.InvariantCultureIgnoreCase));

另请注意,.Equals通常优于&#34; ==&#34;运算符,尤其是字符串,您可以传递StringComparison参数。