Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#-有效地检查字符串是否在特定位置包含字符串(类似regionMatches)_C#_String_Compare_Substring - Fatal编程技术网

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

C#-有效地检查字符串是否在特定位置包含字符串(类似regionMatches),c#,string,compare,substring,C#,String,Compare,Substring,例如,我可能有字符串“Hello world!”,我想检查从位置6(基于0)开始的子字符串是否为“world”——在本例中为true 类似于“Hello world!”。子字符串(6).StartsWith(“world”,StringComparison.Ordinal)可以做到这一点,但它涉及到一个堆分配,这对于类似这样的事情应该是不必要的 (在我的例子中,如果从位置6开始的字符串对于比较来说太短,我不希望出现边界错误-我只希望为false。但是,这很容易编码,因此也欢迎出现边界错误的解决方

例如,我可能有字符串
“Hello world!”
,我想检查从位置6(基于0)开始的子字符串是否为
“world”
——在本例中为true

类似于
“Hello world!”。子字符串(6).StartsWith(“world”,StringComparison.Ordinal)
可以做到这一点,但它涉及到一个堆分配,这对于类似这样的事情应该是不必要的

(在我的例子中,如果从位置6开始的字符串对于比较来说太短,我不希望出现边界错误-我只希望为false。但是,这很容易编码,因此也欢迎出现边界错误的解决方案。)

在Java中,“regionMatches”可以用来实现这种效果(带有边界错误),但我在C#中找不到类似的方法

只是先发制人-显然
包含
索引
是不好的解决方案,因为它们进行了不必要的搜索。(你知道有人会发布这个!)

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

显然,
包含
索引
是不好的解决方案,因为它们进行了不必要的搜索

事实上,这不是真的:有一个超负荷的
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;
inti=0;
如果(str.Length>=6+toFind.Length){
对于(i=0;i
实际上这就是您所描述的……也许。。。nvm只是尝试帮助
只是为了先发制人-显然,Contains和IndexOf是不好的解决方案,因为它们进行了不必要的搜索。(您知道有人会发布此消息)
不仅
子字符串(0)
调用(可能)执行堆分配,
Contains
甚至没有所需的功能,因为它搜索整个字符串(并且使用
IndexOf
的类似解决方案必须检查找到的索引才能给出正确答案)。谢谢你的尝试:)是的,那是我没有找到的。谢谢:)啊,但是我需要小心,不是吗?如果
small
会在
big
的末尾运行,那么这个会抛出边界错误。因此,我需要将其写成
if(pos/*6*/+small.length),并且一如既往地,我还将
StringComparison.ordinallingorecase
作为
IndexOf
的第四个参数,因为它默认使用非常慢的区域性感知比较!