I understand that I can call ToString().IndexOf(...), but I don't want to create an extra string. I understand that I can write a search routine manually. I just wonder why such a routine doesn't already exist in the framework.
我知道我可以调用ToString()。IndexOf(...),但我不想创建额外的字符串。我知道我可以手动编写搜索例程。我只是想知道为什么框架中不存在这样的例程。
3 个解决方案
#1
5
Unfortunately, many of the methods implemented for String could have been implemented for StringBuilder but that was not done. Consider using extension methods to add what you care about.
不幸的是,为String实现的许多方法都可以为StringBuilder实现,但是没有完成。考虑使用扩展方法添加您关心的内容。
#2
38
I know this is an old question, however I have written a extension method that performs an IndexOf
on a StringBuilder
. It is below. I hope it helps anyone that finds this question, either from a Google search or searching *.
我知道这是一个老问题,但是我编写了一个在StringBuilder上执行IndexOf的扩展方法。它在下面。我希望通过Google搜索或搜索*帮助任何人找到这个问题。
/// <summary>
/// Returns the index of the start of the contents in a StringBuilder
/// </summary>
/// <param name="value">The string to find</param>
/// <param name="startIndex">The starting index.</param>
/// <param name="ignoreCase">if set to <c>true</c> it will ignore case</param>
/// <returns></returns>
public static int IndexOf(this StringBuilder sb, string value, int startIndex, bool ignoreCase)
{
int index;
int length = value.Length;
int maxSearchLength = (sb.Length - length) + 1;
if (ignoreCase)
{
for (int i = startIndex; i < maxSearchLength; ++i)
{
if (Char.ToLower(sb[i]) == Char.ToLower(value[0]))
{
index = 1;
while ((index < length) && (Char.ToLower(sb[i + index]) == Char.ToLower(value[index])))
++index;
if (index == length)
return i;
}
}
return -1;
}
for (int i = startIndex; i < maxSearchLength; ++i)
{
if (sb[i] == value[0])
{
index = 1;
while ((index < length) && (sb[i + index] == value[index]))
++index;
if (index == length)
return i;
}
}
return -1;
}
#3
1
Calling ToString()
on a StringBuilder
doesn't create an extra object, confusingly. Internally, StringBuilder
stores a String object, for performance; calling ToString()
simply returns that object.
在StringBuilder上调用ToString()不会造成额外的对象,令人困惑。在内部,StringBuilder存储一个String对象,以提高性能;调用ToString()只返回该对象。
#1
5
Unfortunately, many of the methods implemented for String could have been implemented for StringBuilder but that was not done. Consider using extension methods to add what you care about.
不幸的是,为String实现的许多方法都可以为StringBuilder实现,但是没有完成。考虑使用扩展方法添加您关心的内容。
#2
38
I know this is an old question, however I have written a extension method that performs an IndexOf
on a StringBuilder
. It is below. I hope it helps anyone that finds this question, either from a Google search or searching *.
我知道这是一个老问题,但是我编写了一个在StringBuilder上执行IndexOf的扩展方法。它在下面。我希望通过Google搜索或搜索*帮助任何人找到这个问题。
/// <summary>
/// Returns the index of the start of the contents in a StringBuilder
/// </summary>
/// <param name="value">The string to find</param>
/// <param name="startIndex">The starting index.</param>
/// <param name="ignoreCase">if set to <c>true</c> it will ignore case</param>
/// <returns></returns>
public static int IndexOf(this StringBuilder sb, string value, int startIndex, bool ignoreCase)
{
int index;
int length = value.Length;
int maxSearchLength = (sb.Length - length) + 1;
if (ignoreCase)
{
for (int i = startIndex; i < maxSearchLength; ++i)
{
if (Char.ToLower(sb[i]) == Char.ToLower(value[0]))
{
index = 1;
while ((index < length) && (Char.ToLower(sb[i + index]) == Char.ToLower(value[index])))
++index;
if (index == length)
return i;
}
}
return -1;
}
for (int i = startIndex; i < maxSearchLength; ++i)
{
if (sb[i] == value[0])
{
index = 1;
while ((index < length) && (sb[i + index] == value[index]))
++index;
if (index == length)
return i;
}
}
return -1;
}
#3
1
Calling ToString()
on a StringBuilder
doesn't create an extra object, confusingly. Internally, StringBuilder
stores a String object, for performance; calling ToString()
simply returns that object.
在StringBuilder上调用ToString()不会造成额外的对象,令人困惑。在内部,StringBuilder存储一个String对象,以提高性能;调用ToString()只返回该对象。