[英]Best way to remove characters from string in c# win. form
我有一個長度為98975333的字符串,我需要刪除其中的前5個字母 。 任何人都可以提出最佳方法來牢記性能嗎?
我試過了
str.Substring(5,str.Length);
str.Remove(0,5);
這給了我0.29秒的結果,但是我想要比以上更快的速度。
使用StringBuilder時出現問題
->我需要對字符串的一部分進行子字符串化,為此我需要寫
StringBuilder2.ToString().Substring(anyvaluehere)"
在這里“ .ToString()”將StringBuilder轉換為字符串需要時間,在這種情況下,我不能使用StringBuilder
抱歉,c#字符串不是數組; 它們是不可變的,因此提取(可能很長)子字符串會涉及一個副本。
但是,大多數[字符串工具]都接受開始和結束索引,例如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);
}
}
從源頭上可以看到。 StringReader.Read()
不會復制字符串的未讀部分,而是保留到其余未讀部分的內部索引。
或者說您要跳過字符串的前N個字符,然后通過在每個“,”字符處分割字符串來解析該字符串。 您可以這樣寫:
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>
但是具有相同的第一和第二個值。如果需要,我可以提供。)
如果使用長字符串,請始終使用StringBuilder。 此類比String.Concat或它的語法糖“ a” +“ b”更快,可為您提供快速添加和刪除字符的功能。 此外,StringBuilder.ToString()方法具有特殊的實現,以實現最佳性能。
使用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()方法:
例如
char[] firstfive = new char[5];
sb.CopyTo(0,firstfive,0,5);
編輯:
實際上,OP自己解決了這個問題,但我將其包含在帖子中以供參考:
要將StringBuilder的一部分作為字符串獲取:
sb.ToString(intStart,intLength)
使用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
在這里閱讀更多
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.