c# win中从字符串中删除字符的最佳方法.的形式

本文关键字:最佳 方法 删除 win 字符串 字符 | 更新日期: 2023-09-27 18:18:01

我有一个长度98975333的字符串,我需要删除前5个字母。谁能建议最好的方法来做到这一点,保持性能?

我试着

 str.Substring(5,str.Length);
 str.Remove(0,5);

让我在0.29秒内得到结果但是我想要比上面更快的东西。

使用StringBuilder的问题

->我需要对字符串的一部分进行子字符串处理,为此我需要写入

 StringBuilder2.ToString().Substring(anyvaluehere)"

在这里,通过".ToString()"将StringBuilder转换为字符串需要时间,在这种情况下,我不能使用StringBuilder

c# win中从字符串中删除字符的最佳方法.的形式

如果您正在处理长字符串,请始终使用StringBuilder。这个类提供了快速添加和删除字符的功能,比String更快。或者是语法糖"a"+"b"。此外,StringBuilder.ToString()方法有特殊的实现,以尽可能获得最佳性能。

对不起,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生成和操作字符串将帮助您节省资源:

   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

如果你有一个固定长度的字符串,你希望存储在其他地方,你可以创建一个字符数组,并使用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

点击这里阅读更多