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

C# 用于比较字符串[]是否包含给定字符串的lambda表达式,c#,arrays,linq,expression,C#,Arrays,Linq,Expression,我的项目工作得很好,直到我不得不考虑字符串数组而不是一个。。。我不知道怎么解决这个问题。Country是此方法所在的当前类的属性。它过去是单个字符串,但现在是数组 原来是这样的: private Expression<Func<Payment, bool>> CountryMatches() { if (Country.Length < 1) return Skip; return payment => payment.Country.ToLowe

我的项目工作得很好,直到我不得不考虑字符串数组而不是一个。。。我不知道怎么解决这个问题。
Country
是此方法所在的当前类的属性。它过去是单个字符串,但现在是数组

原来是这样的:

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

您希望对照付款检查
国家/地区的所有内容。国家/地区
,如下所示:

private Expression<Func<Payment, bool>> CountryMatches()
{
   if (Country.Length < 1) return Skip;
   return payment => payment.Country.ToLower().Contains(Country.ToLower());
}
return payment => Country.Any(
    c => payment.Country.ToLower().Contains(c.ToLower()));
这就是说,这是检查一个字符串是否是另一个字符串的子字符串的一种相当糟糕的方法,主要是因为它通过一次又一次地转换成小写来做很多不必要的工作。下面是要做的:

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

您希望对照付款检查
国家/地区的所有内容。国家/地区
,如下所示:

private Expression<Func<Payment, bool>> CountryMatches()
{
   if (Country.Length < 1) return Skip;
   return payment => payment.Country.ToLower().Contains(Country.ToLower());
}
return payment => Country.Any(
    c => payment.Country.ToLower().Contains(c.ToLower()));
这就是说,这是检查一个字符串是否是另一个字符串的子字符串的一种相当糟糕的方法,主要是因为它通过一次又一次地转换成小写来做很多不必要的工作。下面是要做的:

return payment => Country.Any(
    c => payment.Country.IndexOf(c, StringComparison.OrdinalIgnoreCase) >= 0);
输入一个lambda,它可以执行比较。上面的代码假设它返回的某个对象在比较时等于true,但Any返回一个简单bool。因此,试试看

return payment =>
    Country.Any(c =>
        string..Equals(payment.Country, c, StringComparison.InvariantCultureIgnoreCase));
还请注意,这通常比“==”运算符更可取,尤其是对于字符串,当您可以传递StringComparison参数时。

接受lambda,它可以执行比较。上面的代码假设它返回的某个对象在比较时等于true,但Any返回一个简单bool。因此,试试看

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

还请注意,这通常比“==”运算符更可取,尤其是对于字符串,当您可以传递StringComparison参数时。

可能重复的可能重复您应该更改答案,以指出第一个选项由于调用
ToLower
而导致不必要的字符串创建。第二个选择更好,因为它是好的,而第一个是坏的。@PauloMorgado:我不想把太多的注意力放在这个问题上,因为它与问题没有直接关系,但你是对的,它应该被调用。已编辑。您应该将答案更改为第一个选项由于调用
ToLower
而导致不必要的字符串创建。第二个选择更好,因为它是好的,而第一个是坏的。@PauloMorgado:我不想把太多的注意力放在这个问题上,因为它与问题没有直接关系,但你是对的,它应该被调用。编辑。