协慌网

登录 贡献 社区

不区分大小写 '包含(字符串)'

有没有办法让以下返回 true?

string title = "ASTRINGTOTEST";
title.Contains("string");

似乎没有一个过载允许我设置区分大小写。目前我大写它们两个,但这只是愚蠢(我指的是上下套管带来的i18n问题)。

UPDATE
这个问题是古老的,从那时起我就意识到,如果你想完全研究它,我会要求一个简单的答案来解决一个非常庞大而困难的话题。
对于大多数情况,在单语言的英语代码库中, 这个答案就足够了。我怀疑是因为大多数人来到这个类别这是最受欢迎的答案。
然而, 这个答案提出了一个固有的问题,即我们无法比较文本不区分大小写,直到我们知道两个文本是相同的文化并且我们知道文化是什么。这可能是一个不太受欢迎的答案,但我认为它更正确,这就是为什么我这样标记它。

答案

您可以使用String.IndexOf 方法并将StringComparison.OrdinalIgnoreCase作为要使用的搜索类型传递:

string title = "STRING";
bool contains = title.IndexOf("string", StringComparison.OrdinalIgnoreCase) >= 0;

更好的是为字符串定义一个新的扩展方法:

public static class StringExtensions
{
    public static bool Contains(this string source, string toCheck, StringComparison comp)
    {
        return source?.IndexOf(toCheck, comp) >= 0;
    }
}

注意, 空传播 ?.自 C#6.0(VS 2015)起可用,适用于旧版本

if (source == null) return false;
return source.IndexOf(toCheck, comp) >= 0;

用法:

string title = "STRING";
bool contains = title.Contains("string", StringComparison.OrdinalIgnoreCase);

测试字符串paragraph包含字符串word (感谢 @QuarterMeister)

culture.CompareInfo.IndexOf(paragraph, word, CompareOptions.IgnoreCase) >= 0

cultureCultureInfo的实例,描述了文本的编写语言。

这种解决方案对于不区分大小写的定义是透明的, 这种定义与语言有关 。例如,英语使用字符Ii作为第九个字母的大写和小写版本,而土耳其语使用这些字符作为其 29 个字母长字母表的第十一和第十二个字母。土耳其大写版本的'i' 是不熟悉的角色 'İ'。

因此,字符串tinTIN 在英语中是相同的单词,但在土耳其语中是不同的单词。据我所知,一个是 “精神”,另一个是拟声词。 (土耳其人,请纠正我,如果我错了,或建议一个更好的例子)

总而言之, 如果你知道文本是什么语言 ,你只能回答 “这两个字符串是否相同但在不同情况下” 的问题 。如果你不知道,你将不得不采取行动。鉴于英语在软件方面的霸权,你应该求助于CultureInfo.InvariantCulture ,因为它会以熟悉的方式出错。

您可以像这样使用IndexOf()

string title = "STRING";

if (title.IndexOf("string", 0, StringComparison.CurrentCultureIgnoreCase) != -1)
{
    // The string exists in the original
}

由于 0(零)可以是索引,因此请检查 - 1。

MSDN

如果找到该字符串,则从零开始的索引值位置,如果不是,则返回 - 1。如果 value 为 String.Empty,则返回值为 0。