我有一串长度98975333 ,我需要删除前5个字母。任何人都可以建议最好的方法来记住性能吗?
我试过
str.Substring(5,str.Length);
str.Remove(0,5);
这给了我结果0.29秒 但我想要比上面更快的东西。
使用StringBuilder的问题
- >我需要子串字符串的一部分,为此我需要写
StringBuilder2.ToString().Substring(anyvaluehere)"
这里将StringBuilder转换为字符串“.ToString()”需要时间,在这种情况下我不能使用StringBuilder
答案 0 :(得分:1)
抱歉,c#字符串不是数组;它们是immutable所以提取一个(可能很长的)子字符串需要一个副本。
但是,大多数[字符串实用程序]接受开始和结束索引,例如IndexOf
和CompareInfo.Compare
都会导致startIndex
重载。
也许如果你告诉我们你之后想做什么,我们可以建议替代方案吗?
<强>更新强>
以下是一些使用c#中的不可变字符串编写高性能字符串解析的方法。比如说你需要在字符串中反序列化XML数据,并且需要跳过前N个字符。你可以这样做:
public static object XmlDeserializeFromString<T>(this string objectData, int skip)
{
var serializer = new XmlSerializer(typeof(T));
using (var reader = new StringReader(objectData))
{
for (; skip > 0 && reader.Read() != -1; skip--)
;
return (T)serializer.Deserialize(reader);
}
}
从the source可以看出。 StringReader.Read()
不会复制字符串的未读部分,它会保留剩余未读部分的内部索引。
或者说你想跳过一个字符串的前N个字符,然后通过在每个&#34;,#34;中分割它来解析字符串。字符。你可以这样写:
public static IEnumerable<Pair<int>> WalkSplits(this string str, int startIndex, int count, params char[] separator)
{
if (string.IsNullOrEmpty(str))
yield break;
var length = str.Length;
int endIndex;
if (count < 0)
endIndex = length;
else
{
endIndex = startIndex + count;
if (endIndex > length)
endIndex = length;
}
while (true)
{
int nextIndex = str.IndexOfAny(separator, startIndex, endIndex - startIndex);
if (nextIndex == startIndex)
{
startIndex = nextIndex + 1;
}
else if (nextIndex == -1)
{
if (startIndex < endIndex)
yield return new Pair<int>(startIndex, endIndex - 1);
yield break;
}
else
{
yield return new Pair<int>(startIndex, nextIndex - 1);
startIndex = nextIndex + 1;
}
}
}
然后使用Pair
的开始和结束索引来进一步解析字符串,或者提取小的子字符串以提供进一步的解析方法。
(Pair<T>
是我创建的一个类似于KeyValuePair<TKey, TValue>
的小结构,但具有相同类型的第一和第二值。如果需要,我可以提供。)
答案 1 :(得分:1)
如果使用长字符串,请始终使用StringBuilder。这个类为你提供快速添加和删除字符,比String.Concat或它的语法糖“a”+“b”更快。此外,StringBuilder.ToString()方法具有特殊的实现,以实现最佳性能。
答案 2 :(得分:0)
使用StringBuilder生成和操作字符串将帮助您节省资源:
StringBuilder sb = new StringBuilder();
sb.Append("text"); //to add text in front
sb.Insert(50,"text"); // to insert text
sb.Remove(50,4); // to remove text
sb.ToString(); // to produce the string
如果你有一个固定长度的字符串,你希望存储在别处,你可以创建一个char数组并使用StringBuilder的CopyTo()方法:
e.g。
char[] firstfive = new char[5];
sb.CopyTo(0,firstfive,0,5);
编辑:
实际上,OP自己想出来了,但我把它包括在帖子中供参考:
将StringBuilder的一部分作为字符串:
sb.ToString(intStart,intLength)
答案 3 :(得分:-1)
使用String.Remove()
即
String newStr = "";
newStr = str.Remove(0,5); //This will delete 5 characters starting from 0 index
或者
newStr = str.Remove(5); //Assumes the starting position as 0 and will ddelete 5 chars from that
了解更多Here