簡體   English   中英

在C#Win中從字符串中刪除字符的最佳方法。 形成

[英]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#字符串不是數組; 它們是不可變的,因此提取(可能很長)子字符串會涉及一個副本。

但是,大多數[字符串工具]都接受開始和結束索引,例如IndexOfCompareInfo.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM