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

本文关键字:字符串 Lambda 表达式 是否 比较 用于 包含 | 更新日期: 2023-09-27 18:03:31

我的项目工作得很好,直到我不得不考虑字符串数组,而不仅仅是一个…我不知道该怎么解决。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();
}

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

您要根据payment.Country检查Country的所有内容,如下所示:

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

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

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

。取一个in,它可以执行比较。上面的代码假定它返回的对象在比较时等于true,但是Any返回的是一个简单的bool值。因此,试着

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

还要注意,. equals通常比"=="操作符更可取,特别是对于字符串,可以传递StringComparison形参。