C# - 有效检查字符串是否包含特定位置的字符串(类似于 regionMatches)
C# - efficiently check if string contains string at specific position (something like regionMatches)
例如,我可能有字符串 "Hello world!"
,我想检查从位置 6(从 0 开始)开始的子字符串是否为 "world"
- 在本例中为真。
像"Hello world!".Substring(6).StartsWith("world", StringComparison.Ordinal)
这样的东西可以做到,但它涉及堆分配,对于这样的东西来说应该是不必要的。
(在我的例子中,如果从位置 6 开始的字符串对于比较来说太短,我不希望出现边界错误 - 我只想要 false。但是,这很容易编码,所以解决方案会给出也欢迎边界错误。)
在 Java 中,'regionMatches' 可用于实现此效果(带有边界错误),但我在 C# 中找不到等效项。
只是先发制人 - 显然 Contains
和 IndexOf
是糟糕的解决方案,因为它们进行了不必要的搜索。 (你知道有人会 post 这个!)
如果一切都失败了,我很快就可以为此编写我自己的函数 - 主要是我想知道是否有一个我错过的内置函数。
obviously Contains
and IndexOf
are bad solutions because they do an unnecessary search
实际上,事实并非如此:IndexOf
的超载使您可以控制搜索匹配项应该走多远。如果你告诉它停留在一个特定的指数,它会完全按照你想要的实现。
这是您可以使用的 IndexOf
的三参数重载。为 count
参数传递目标长度将阻止 IndexOf
考虑任何其他位置:
var big = "Hello world!";
var small = "world";
if (big.IndexOf(small, 6, small.Length) == 6) {
...
}
给你
static void Main(string[] args)
{
string word = "Hello my friend how are you ?";
if (word.Substring(0).Contains("Hello"))
{
Console.WriteLine("Match !");
}
}
或手动
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;
例如,我可能有字符串 "Hello world!"
,我想检查从位置 6(从 0 开始)开始的子字符串是否为 "world"
- 在本例中为真。
像"Hello world!".Substring(6).StartsWith("world", StringComparison.Ordinal)
这样的东西可以做到,但它涉及堆分配,对于这样的东西来说应该是不必要的。
(在我的例子中,如果从位置 6 开始的字符串对于比较来说太短,我不希望出现边界错误 - 我只想要 false。但是,这很容易编码,所以解决方案会给出也欢迎边界错误。)
在 Java 中,'regionMatches' 可用于实现此效果(带有边界错误),但我在 C# 中找不到等效项。
只是先发制人 - 显然 Contains
和 IndexOf
是糟糕的解决方案,因为它们进行了不必要的搜索。 (你知道有人会 post 这个!)
如果一切都失败了,我很快就可以为此编写我自己的函数 - 主要是我想知道是否有一个我错过的内置函数。
obviously
Contains
andIndexOf
are bad solutions because they do an unnecessary search
实际上,事实并非如此:IndexOf
的超载使您可以控制搜索匹配项应该走多远。如果你告诉它停留在一个特定的指数,它会完全按照你想要的实现。
这是您可以使用的 IndexOf
的三参数重载。为 count
参数传递目标长度将阻止 IndexOf
考虑任何其他位置:
var big = "Hello world!";
var small = "world";
if (big.IndexOf(small, 6, small.Length) == 6) {
...
}
给你
static void Main(string[] args)
{
string word = "Hello my friend how are you ?";
if (word.Substring(0).Contains("Hello"))
{
Console.WriteLine("Match !");
}
}
或手动
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;