例如,我可能有字符串"Hello world!"
,我想检查从位置 6(从 0 开始)开始的子字符串是否"world"
- 在本例中为 true。
像"Hello world!".Substring(6).StartsWith("world", StringComparison.Ordinal)
这样的事情会这样做,但它涉及堆分配,这对于这样的事情应该是不必要的。
(就我而言,如果从位置 6 开始的字符串太短而无法进行比较,我不希望出现边界错误 - 我只想要 false。但是,这很容易编码,因此也欢迎给出边界错误的解决方案。
在Java中,"regionMatches"可以用来实现这种效果(有边界错误),但我在C#中找不到等效的。
只是为了先发制人 - 显然Contains
和IndexOf
是糟糕的解决方案,因为它们进行了不必要的搜索。(你知道有人会发布这个!
如果所有其他方法都失败了,可以快速为此编写我自己的函数 - 主要是我想知道是否有我错过的内置函数。
显然,
Contains
和IndexOf
是糟糕的解决方案,因为它们进行了不必要的搜索
实际上,事实并非如此:IndexOf
过载会让您控制它在寻找匹配项时应该走多远。如果你告诉它停留在一个特定的索引上,它就会做你想要实现的目标。
下面是您可以使用的IndexOf
的三参数重载。传递 count
参数的目标长度将阻止IndexOf
考虑任何其他位置:
var big = "Hello world!";
var small = "world";
if (big.IndexOf(small, 6, small.Length) == 6) {
...
}
演示。
或手动
int i = 0;
if (str.Length >= 6 + toFind.Length) {
for (i = 0; i < toFind.Length; i++)
if (str[i + 6] != toFind[i])
break;
}
bool ok = i == toFind.Length;
你在这里
static void Main(string[] args)
{
string word = "Hello my friend how are you ?";
if (word.Substring(0).Contains("Hello"))
{
Console.WriteLine("Match !");
}
}