在 C# 中使用 lambda 表达式时如何忽略大小写?

Mel*_*ssa 0 c#

我有一个 lambda 表达式如下:

 var obj = data.FirstOrDefault(x => x.id == id && x.city == city.ToLower());
Run Code Online (Sandbox Code Playgroud)

数据是一个列表

我怎样才能做到忽略大小写?

Chr*_*ler 6

String.Equals(String, StringComparison)是通常首选的方法:

var obj = data.FirstOrDefault(x => x.id == id 
    && x.city.Equals(city, StringComparison.OrdinalIgnoreCase));
Run Code Online (Sandbox Code Playgroud)

但是,如果您的 lambda 将被解释为表达式树(如 EF 到 SQL 的情况),则可能不支持或可能不需要StringComparison 。

在不支持StringComparison 的情况下,您可以.ToLower()对两个操作数执行:

var obj = data.FirstOrDefault(x => x.id == id 
    && x.city.ToLower() == city.ToLower());
Run Code Online (Sandbox Code Playgroud)

但请注意,这会在两个操作数上执行该函数,在表达式树中,这可能会对性能产生影响,对于 EF 到 SQL 方案,您应该考虑使用不区分大小写的排序规则,而不是转换列值以使用受影响列上的索引。

String.ToLower()调用者注意事项正如使用字符串的最佳实践
中所述,我们建议您避免调用替换默认值的字符串大小写方法,而应调用需要显式指定参数的方法。若要使用当前区域性的大小写约定将字符转换为小写,请通过使用其区域性参数的值CurrentCulture调用ToLower(CultureInfo)方法重载来显式表明您的意图。如果您不需要语言感知比较,请考虑使用Ordinal