我知道我可以调用ToString().IndexOf(...),但我不想创建额外的字符串。我知道我可以手动编写一个搜索例程。我只是想知道为什么框架中不存在这样的例程。
发布于 2009-08-31 23:57:33
不幸的是,许多为String实现的方法本可以为StringBuilder实现,但没有实现。考虑使用扩展方法来添加您关心的内容。
发布于 2020-11-28 00:02:05
丹尼斯,很好的解决方案。谢谢。我建议对其进行一点优化:
public static int IndexOf(
this StringBuilder sb,
string value,
int startIndex,
bool ignoreCase)
{
int len = value.Length;
int max = (sb.Length - len) + 1;
var v1 = (ignoreCase)
? value.ToLower() : value;
var func1 = (ignoreCase)
? new Func<char, char, bool>((x, y) => char.ToLower(x) == y)
: new Func<char, char, bool>((x, y) => x == y);
for (int i1 = startIndex; i1 < max; ++i1)
if (func1(sb[i1], v1[0]))
{
int i2 = 1;
while ((i2 < len) && func1(sb[i1 + i2], v1[i2]))
++i2;
if (i2 == len)
return i1;
}
return -1;
}
发布于 2009-09-01 00:01:45
令人困惑的是,在StringBuilder
上调用ToString()
并不会创建额外的对象。为了提高性能,StringBuilder
在内部存储了一个String对象;调用ToString()
只是返回该对象。
https://stackoverflow.com/questions/1359948
复制相似问题