Char []的SubSequence是否等于String的内容?

时间:2015-03-01 15:40:10

标签: c#

是否有更快的方法来检查char数组的子序列,从特定索引是否等于字符串?

bool Matches (Char[] cs, int i, string s)
{
    return cs.Skip(i).Take(s.Length).SequenceEqual(s);
}

假设css永远不会null

在运行时更快。 我也可以在不创建字符串的新实例的情况下完成吗?因为两者都可以看作是char数组。

我希望有一些C's strncmp

的内容

2 个答案:

答案 0 :(得分:3)

只需使用简单的for循环即可。这个旨在消除s上的边界检查。

bool Matches (char[] chars, int offset, string s)
{
    if(offset < 0)
        throw new ArgumentOutOfRangeException("offset");
    if(chars.Length - offset < s.Length)
        throw new ArgumentException();
    for(int i = 0; i < s.Length; i++)
    {
        if(chars[offset + i] != s[i])
            return false;
    }
    return true;
}

答案 1 :(得分:2)

好吧,你总是可以自己编写循环并取消枚举器:

if (cs == null || s == null)
    throw new ArgumentNullException();
if (i < 0 || i > cs.Length)
    throw new ArgumentException("i");
if (cs.Length - i != s.Length)
    return false;
for (int j = 0; j != s.Length; ++j) {
    if (s[j] != cs[j + i])
        return false;
}
return true;

但是这仍然没有调用本地字符串函数那么快,因为它确实限制了对每个下标访问的检查(通常这不是什么大问题,但是因为你追求速度,为什么不去全猪)。所以我们可以降低抽象级别并使用指针:

if (cs == null || s == null)
    throw new ArgumentNullException();
if (i < 0 || i > cs.Length)
    throw new ArgumentException("i");
if (cs.Length - i != s.Length)
    return false;
unsafe {
     fixed (char* ps = s, pcs_ = cs) {
        char* pcs = pcs_ + i;
        for (int j = 0; j != s.Length; ++j) {
            if (pcs[j] != ps[j])
                return false;
        }
    }
}
return true;