C# - 有效地检查字符串是否包含特定位置的字符串(类似于regionMatches)

ent*_*heh 7 c# string compare substring

例如,我可能有字符串"Hello world!",我想检查从位置6(从0开始)开始的子字符串是否为"world"- 在这种情况下为真.

像"Hello world!".Substring(6).StartsWith("world", StringComparison.Ordinal)它会做的事情,但它涉及堆分配,这对于这样的事情应该是不必要的.

(在我的情况下,如果从位置6开始的字符串太短而无法进行比较,我不想要一个边界错误 - 我只是想要假.但是,这很容易编码,所以提供边界错误的解决方案也是欢迎.)

在Java中,'regionMatches'可以用来实现这种效果(带有bounds错误),但我找不到C#中的等价物.

只是为了抢先-显然Contains并IndexOf是不好的解决方案,因为他们做不必要的搜索.(你知道有人会发布这个!)

如果所有其他方法都失败了,我可以快速编写自己的函数 - 主要是我想知道是否有一个我错过的内置函数.

das*_*ght 14

显然Contains和IndexOf是坏的解决方案,因为他们做不必要的搜索

实际上,这不是真的:有一个超载IndexOf让你可以控制在搜索比赛中应该走多远.如果你告诉它留在一个特定的索引,那么它将完全符合你想要的目标.

这是IndexOf您可以使用的三参数重载.传递count参数的目标长度将阻止IndexOf考虑任何其他位置:

var big = "Hello world!";
var small = "world";
if (big.IndexOf(small, 6, small.Length) == 6) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

演示.

  • 啊,但是我需要小心,不要我 - 如果`small`会在'big`的末尾运行,这个**会抛出边界错误.所以我需要把它写成`if(pos/*6*/+ small.length <= big.length && ...`:) (3认同)