【问题标题】:set ignore case value in when expression on strings在字符串上的表达式中设置忽略大小写值
【发布时间】:2024-07-05 17:20:01
【问题描述】:

我知道如何检查一个字符串是否在另一个字符串中 喜欢这段代码。

when (myString) {
        in "FirstString"  -> {
                // some stuff
        }
        in "SecondString" -> {
                // some stuff
        }
        else -> {
                // some stuff
        }
}

in 关键字在后台调用此方法CharSequence.contains(other: CharSequence, ignoreCase: Boolean = false)

问题是这样的:

在这种情况下我可以设置 ignoreCase = true 吗?

【问题讨论】:

  • 一个选项是 when (myString.toLowerCase()) 并且大小写为小写
  • @ShreyGarg。感谢您的回复,它可以提供帮助,但忽略大小写和 toLowerCase() 不相等。
  • 不一样,但恕我直言 toLowerCase 在给定的场景中应该足够了。您认为这里有一些情况在使用 toLowerCase 时可能会失败?
  • 不,但是有一点,如果我们想选择这种方式,因此对于我们when的所有分支,我们应该像这样写.toLowerCase()"FirstString".toLowerCase()"SecondString".toLowerCase()
  • 是的,如果它们是可变的,那么这将是必需的。但如果它们是常量,简单的“firststring”、“secondstring”就可以了。

标签: string kotlin contains case-sensitive


【解决方案1】:

您可以为when之前的字符串声明一个临时本地运算符函数contains

fun main() {

    operator fun String.contains(other: String): Boolean = this.contains(other, ignoreCase = true)

    when(myString) {
        in "firstString" -> ...
    }
}

这样,将为in 运算符调用该函数,而不是标准库中声明的函数,因为它位于更近的范围内。

但是请注意,这个技巧只有在原来的 contains 函数是一个扩展时才有效。如果是成员函数,则不能被扩展覆盖。

【讨论】:

    【解决方案2】:

    你可以在这里使用toLowerCase()函数:

    when (myString.toLowerCase()) {
        in "firststring"  -> {
                // some stuff
        }
        in "secondstring" -> {
                // some stuff
        }
        else -> {
                // some stuff
        }
    }
    

    对于when 的情况,如果它们是变量,则需要对它们中的每一个调用toLowerCase()。但是,如果它们是常量,那么简单地使用小写字符串就可以了 - "firststring""secondstring"

    【讨论】:

      最近更新 更多