Agent_Spock
Agent_Spock

Reputation: 1177

Best way to remove characters from string in c# win. form

i have a string of length 98975333 and i need to remove first 5 letters in it. Can anyone suggest the best way to do this keeping performance in mind?

I tried

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

which gives me result in 0.29 sec but i want something even faster than the above.

Problem Using StringBuilder

-> i need to substring a part of the string and to do this i need to write

 StringBuilder2.ToString().Substring(anyvaluehere)"

here the conversion of StringBuilder to string by ".ToString()" takes time and in this case i cant use StringBuilder

Upvotes: 0

Views: 2584

Answers (4)

Tyress
Tyress

Reputation: 3653

Using a StringBuilder to produce and manipulate the string will help you save on resources:

   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

If you have a fixed length of string that you wish to store elsewhere, you can make a char array and use StringBuilder's CopyTo() method:

e.g.

    char[] firstfive = new char[5];
    sb.CopyTo(0,firstfive,0,5);

Edit:

Actually, the OP figured this out himself, but I'm including it on the post for reference:

To get a portion of the StringBuilder as string:

sb.ToString(intStart,intLength)

Upvotes: 0

dbc
dbc

Reputation: 116796

Sorry, c# strings are not arrays; they are immutable so extracting a (possibly very long) substring involves a copy.

However, most [string utilities] accept start and end indices, for instance IndexOf and CompareInfo.Compare all take a startIndexoverload.

Perhaps if you tell us what you want to do afterward we could suggest alternatives?

Update

Here are some ways you can write performant string parsing with the immutable strings in c#. Say for instance that you need to deserialize XML data inside the string, and need to skip the first N characters. You could do something like this:

    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);
        }
    }

As you can see from the source. StringReader.Read() does not make a copy of the unread portion of the string, it keeps an internal index to the remaining unread portion.

Or say you want to skip the first N characters of a string, then parse the string by splitting it at every "," character. You could write something like this:

    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;
            }
        }
    }

And then use the start and end indices of the Pair to further parse the string, or extract small substrings to feed to further parsing methods.

(Pair<T> is a small struct I created similar to KeyValuePair<TKey, TValue> but with identically typed first and second values. I can provide if needed.)

Upvotes: 1

Pavel P&#225;ja Halbich
Pavel P&#225;ja Halbich

Reputation: 1583

If you are working with long strings, always use StringBuilder. This class provides you fast adding and removing characters, faster than String.Concat or it's syntactic sugar "a" + "b". Moreover StringBuilder.ToString() method has special implementation for best performance as possible.

Upvotes: 1

Ingila Ejaz
Ingila Ejaz

Reputation: 399

Use String.Remove() i.e

String newStr = "";
newStr = str.Remove(0,5); //This will delete 5 characters starting from 0 index 

Or

newStr = str.Remove(5); //Assumes the starting position as 0 and will ddelete 5 chars from that

Read more Here

Upvotes: -1

Related Questions