有没有一种方法可以实现以下返回?
string title = "ASTRINGTOTEST";
title.Contains("string");
似乎没有一个过载允许我设置大小写敏感度。目前,我对这两个问题都有夸大的感觉,但这太傻了(我指的是大小写中的i18n问题)。
更新
这是一个古老的问题,从那时起,我意识到,如果你愿意充分调查,我要求一个非常广泛和困难的问题的简单答案。
对于大多数情况,在单语言、英语代码基础上,这个答案就足够了。我怀疑,因为大多数来这里的人都属于这一类,这是最流行的答案。
然而,这个答案带来了一个固有的问题,即在我们知道两个文本都是相同的文化并且我们知道文化是什么之前,我们不能比较文本不区分大小写。这可能是一个不太流行的答案,但我认为它更正确,这就是我将其标记为这样的原因。
OrdinalIgnoreCase、CurrentCultureIgnoreCare或InvariantCultureIgnoleCase?
由于缺少此项,以下是关于何时使用哪项的一些建议:
Dos
使用StringComparison.OrdinalIgnoreCase进行比较作为区域性不可知字符串匹配的安全默认值。使用StringComparison.OrdinalIgnoreCase比较以提高速度。使用StringComparison.CurrentCulture-based字符串操作当向用户显示输出时。基于不变量切换字符串操作的当前使用当比较为语言上不相关(例如象征性的)。在以下情况下使用ToUpperInvariant而不是ToLowerInvariant标准化字符串以进行比较。
不应该做的
对不显式执行的字符串操作使用重载或隐式指定字符串比较机制。使用基于StringComparison.InvariantCulture的字符串大多数情况下的操作;少数例外之一是保持语言上有意义但文化上不可知的数据。
根据这些规则,您应该使用:
string title = "STRING";
if (title.IndexOf("string", 0, StringComparison.[YourDecision]) != -1)
{
// The string exists in the original
}
而[YourDecision]则取决于上面的建议。
源链接:http://msdn.microsoft.com/en-us/library/ms973919.aspx
与前面的答案类似(使用扩展方法),但有两个简单的空检查(C#6.0及以上版本):
public static bool ContainsIgnoreCase(this string source, string substring)
{
return source?.IndexOf(substring ?? "", StringComparison.OrdinalIgnoreCase) >= 0;
}
如果源为空,则返回false(通过空传播运算符?)
如果子字符串为空,则将其视为空字符串并返回true(通过空合并运算符??)
如果需要,StringComparison当然可以作为参数发送。
.NET Core 2.0+(包括.NET 5.0+)
自2.0版以来,.NET Core有两种方法来处理此问题:
String.Contains(Char,StringComparison)String.Contains(字符串,StringComparison)
例子:
"Test".Contains("test", System.StringComparison.CurrentCultureIgnoreCase);
它现在正式成为.NET标准2.1的一部分,因此也是实现此版本标准(或更高版本)的基类库的所有实现的一部分。
测试字符串段落是否包含字符串单词(谢谢@QuarterMeister)
culture.CompareInfo.IndexOf(paragraph, word, CompareOptions.IgnoreCase) >= 0
其中,culture是描述文本所用语言的CultureInfo的实例。
此解决方案对于不区分大小写的定义是透明的,这取决于语言。例如,英语在第九个字母的大写和小写版本中使用字符I和I,而土耳其语在其29个字母的长字母表中的第十一和第十二个字母中使用这些字符。土耳其大写的“i”是一个不熟悉的字符“yi”。
因此,字符串tin和tin在英语中是相同的单词,但在土耳其语中是不同的单词。据我所知,一个是“精神”,另一个是拟声词。(土耳其人,如果我错了,请纠正我,或者建议一个更好的例子)
总之,如果你知道文本是什么语言,你只能回答“这两个字符串是相同的,但在不同的情况下”这个问题。如果你不知道,你就必须接受双关语。鉴于英语在软件领域的霸主地位,你可能应该求助于CultureInfo.InvariantCulture,因为它在熟悉的方面是错误的。