【问题标题】:lambda expressions for comparing whether or not a string[] contains a given string用于比较 string[] 是否包含给定字符串的 lambda 表达式
【发布时间】:2017-02-12 16:10:48
【问题描述】:

我的项目工作得很好,直到我不得不考虑一组字符串而不仅仅是一个......我不知道如何解决这个问题。 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();
}

【问题讨论】:

标签: c# arrays linq expression


【解决方案1】:

您想检查Countrypayment.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);

【讨论】:

  • 您应该更改您的答案,指出由于调用ToLower,第一个选项会导致不必要的字符串创建。第二种方法更好,第一种方法不好。
  • @PauloMorgado:我不想过多关注这个问题,因为它与问题没有直接关系,但你说得对,应该指出它。已编辑。
【解决方案2】:

.Any 接受一个 lambda,它可以执行您的比较。上面的代码假定它返回一些在比较时等于 true 的对象,但 Any 返回一个简单的布尔值。因此,尝试

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

另请注意,.Equals 通常比“==”运算符更可取,尤其是对于字符串,因为您可以传递 StringComparison 参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-10
    • 1970-01-01
    • 2017-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多