有没有办法让以下返回true?
string title = "ASTRINGTOTEST";
title.Contains("string");
没有什么是愚蠢的(我指的是上下套管带来的i18n问题) .
UPDATE
这个问题是古老的,从那时起我就意识到,如果你想完全研究它,我会要求一个简单的答案来解决一个非常庞大而困难的话题 .
对于大多数情况,在单语言的英语代码库中,答案就足够了 . 我怀疑是因为大多数人来到这个类别这是最受欢迎的答案 .
然而,This答案提出了我们可以如此标记的固有问题 .
24 回答
这里的技巧是寻找字符串,忽略大小写,但要保持完全相同(使用相同的情况) .
输出是“重置”
这很简洁 .
如果你想检查你传递的字符串是否在字符串中,那么有一个简单的方法 .
这与此处的其他示例非常相似,但我决定将枚举简化为bool,primary,因为通常不需要其他替代方法 . 这是我的例子:
用法如下:
仅
.NET Core 2.0(截至目前)
从2.0版开始,.NET Core有一对处理这个问题的方法:
String.Contains(Char, StringComparison )
String.Contains(String, StringComparison )
例:
随着时间的推移,他们可能会进入.NET标准,并从那里进入基类库的所有其他实现 .
您可以使用String.IndexOf Method并传递StringComparison.OrdinalIgnoreCase作为要使用的搜索类型:
更好的是为字符串定义一个新的扩展方法:
请注意,自C#6.0(VS 2015)起,null propagation
?.
可供旧版本使用用法:
如果您对国际化有所顾虑(或者您可以重新实现),那么VisualBasic程序集中的
InStr
方法是最好的 . 在它看来dotNeetPeek显示它不仅占大写字母和小写字母,而且还包括假名类型和全长与半宽字符(主要与亚洲语言相关,尽管罗马字母也有全宽版本) ) . 我正在跳过一些细节,但请查看私有方法InternalInStrText
:您可以先将字符串向上或向下放大 .
哎呀,刚看到最后一点 . 不区分大小写的比较
*
可能*
无论如何也是如此,如果性能不是问题,我认为创建大写副本并比较它们没有问题 . 我曾经发誓我曾经看过一次不区分大小写的比较...答案的一个问题是,如果字符串为null,它将抛出异常 . 您可以将其添加为支票,这样就不会:
您可以使用
string.indexof ()
功能 . 这将不区分大小写使用Regex的替代解决方案:
Notice
正如@cHao在他的评论中指出的那样,有一些情况会导致这个解决方案返回错误的结果 . 在随意实施此解决方案之前,请确保您知道自己在做什么 .
我知道这不是C#,但在框架(VB.NET)中已经存在这样的功能
C#变种:
用这个:
这些是最简单的解决方案 .
测试字符串
paragraph
是否包含字符串word
(感谢@QuarterMeister)其中
culture
是CultureInfo的实例,描述了写入文本的语言 .该解决方案对于 the definition of case-insensitivity, which is language dependent 是透明的 . 例如,英语使用字符
I
和i
作为第九个字母的大写和小写版本,而土耳其语使用这些字符作为其29个字母长字母的eleventh and twelfth letters . 'i'的土耳其大写版本是不熟悉的字符'İ' .因此字符串
tin
和TIN
在英语中是相同的单词,但在土耳其语中是不同的单词 . 据我所知,一个是'spirit',另一个是拟声词 . (土耳其人,请纠正我,如果我错了,或建议一个更好的例子)总而言之,如果您知道该文本所使用的语言,则只能回答问题'are these two strings the same but in different cases' . 如果您不愿意采取行动 . 鉴于英语在软件方面的霸权,你应该诉诸于CultureInfo.InvariantCulture,因为以熟悉的方式会出错 .
新手的简单方法:
最终,通用的“包含”操作归结为这样的函数,
这可以简单地包含在接受
IEnumerable
这样的扩展版本中,现在,这将适用于序数比较任何序列,包括字符串,因为
string
实现IEnumerable<char>
,但是,正如我们所知,字符串不是通用的,它们是专门的 . 有两个关键因素在起作用 .
"casing"问题本身有各种语言相关的边缘情况 .
如果一组"Text Elements"(字母/数字/符号等)由Unicode代码点表示以及哪些有效的字符序列可以表示给定字符串,则涉及的问题在these answers中进行了扩展 .
净效果是一样的 . 您可能声称在语言上相等的字符串可以通过不同的字符组合有效地表示 . 更重要的是,有效性规则在不同文化之间发生变化 .
所有这些都导致了一个基于特殊字符串的“包含”实现 .
无论字符串的规范化如何,此函数都可用于执行不区分大小写,特定于文化的“包含” . 例如
您可以像这样使用
IndexOf()
:由于0(零)可以是索引,因此请检查-1 .
MSDN
使用RegEx是一种直接的方法:
OrdinalIgnoreCase, CurrentCultureIgnoreCase or InvariantCultureIgnoreCase?
由于缺少这个,这里有一些关于何时使用哪一个的建议:
Dos
使用
StringComparison.OrdinalIgnoreCase
进行比较,作为与文化无关的字符串匹配的安全默认值 .使用
StringComparison.OrdinalIgnoreCase
比较可提高速度 .向用户显示输出时使用
StringComparison.CurrentCulture-based
字符串操作 .基于不变文化切换当前字符串操作的使用,以便在比较时使用非语言
StringComparison.Ordinal
或StringComparison.OrdinalIgnoreCase
在语言上无关紧要(例如,象征性的) .
在规范化字符串以进行比较时使用
ToUpperInvariant
而不是ToLowerInvariant
.不要做
对未明确或隐式指定字符串比较机制的字符串操作使用重载 .
使用基于
StringComparison.InvariantCulture
的字符串大多数情况下的操作;少数例外之一
坚持语言上有意义但与文化无关的数据 .
根据这些规则,您应该使用:
而[YourDecision]取决于上述建议 .
来源链接:http://msdn.microsoft.com/en-us/library/ms973919.aspx
StringExtension类是前进的方法,我结合上面的几个帖子给出了一个完整的代码示例:
像这样: