是否有更快的方法来检查char数组的子序列,从特定索引是否等于字符串?
bool Matches (Char[] cs, int i, string s)
{
return cs.Skip(i).Take(s.Length).SequenceEqual(s);
}
假设cs
和s
永远不会null
。
在运行时更快。 我也可以在不创建字符串的新实例的情况下完成吗?因为两者都可以看作是char数组。
我希望有一些C's strncmp
的内容答案 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;