Подтвердить что ты не робот

Обязательно ли проверять перед заменой строки в StringBuilder (используя такие функции, как "Содержит" или "IndexOf" )?

Есть ли какой-либо метод IndexOf или Содержит в С#. Ниже приведен код:

var sb = new StringBuilder(mystring);
sb.Replace("abc", "a");
string dateFormatString = sb.ToString();

if (sb.ToString().Contains("def"))
{
    sb.Replace("def", "aa");
}


if (sb.ToString().Contains("ghi"))
{
    sb.Replace("ghi", "assd");
}

Как вы могли заметить, я снова и снова использую ToString() выше, чего я хочу избежать, поскольку он создает новую строку каждый раз. Можете ли вы мне помочь, как я могу избежать этого?

4b9b3361

Ответ 1

Если StringBuilder не содержит "def", то выполнение замены не вызовет никаких проблем, поэтому используйте:

var sb = new StringBuilder(mystring);
sb.Replace("abc", "a");
sb.Replace("def", "aa");
sb.Replace("ghi", "assd");

Ответ 2

Нет такого метода в StringBuilder, но вам не нужны теги Contains. Вы можете просто написать это следующим образом:

 sb.Replace("abc", "a");
 sb.Replace("def", "aa");
 sb.Replace("ghi", "assd");

Если строка в первом параметре Replace не найдена, то вызов Replace - это нулевая операция - именно то, что вы хотите.

В документации указано:

Заменяет все вхождения указанной строки в этом экземпляре другой указанной строкой.

То, как вы читаете это, заключается в том, что, когда нет вхождений, ничего не делается.

Ответ 3

Вы можете написать класс, который расширяет методы для объекта StringBuilder. Здесь я добавил IndexOf, Substring и другие методы в класс StringBuilder. Просто поставьте этот класс в свой проект.

using System;
using System.Text;

namespace Helpers
{
    /// <summary>
    /// Adds IndexOf, IsStringAt, AreEqual, and Substring to all StringBuilder objects.
    /// </summary>
    public static class StringBuilderExtension
    {
        // Adds IndexOf, Substring, AreEqual to the StringBuilder class.
        public static int IndexOf(this StringBuilder theStringBuilder,string value)
        {
            const int NOT_FOUND = -1;
            if (theStringBuilder == null)
            {
                return NOT_FOUND;
            }
            if (String.IsNullOrEmpty(value))
            {
                return NOT_FOUND;
            }
            int count = theStringBuilder.Length;
            int len = value.Length;            
            if (count < len)
            {
                return NOT_FOUND;
            }
            int loopEnd = count - len + 1;
            for (int loop = 0; loop < loopEnd; loop++)
            {
                bool found = true;
                for (int innerLoop = 0; innerLoop < len; innerLoop++)
                {
                    if (theStringBuilder[loop + innerLoop] != value[innerLoop])
                    {
                        found = false;
                        break;
                    }
                }
                if (found)
                {
                    return loop;
                }
            }
            return NOT_FOUND;
        }
        public static int IndexOf(this StringBuilder theStringBuilder, string value,int startPosition)
        {
            const int NOT_FOUND = -1;
            if (theStringBuilder == null)
            {
                return NOT_FOUND;
            }
            if (String.IsNullOrEmpty(value))
            {
                return NOT_FOUND;
            }
            int count = theStringBuilder.Length;
            int len = value.Length;
            if (count < len)
            {
                return NOT_FOUND;
            }
            int loopEnd = count - len + 1;
            if (startPosition >= loopEnd)
            {
                return NOT_FOUND;
            }
            for (int loop = startPosition; loop < loopEnd; loop++)
            {
                bool found = true;
                for (int innerLoop = 0; innerLoop < len; innerLoop++)
                {
                    if (theStringBuilder[loop + innerLoop] != value[innerLoop])
                    {
                        found = false;
                        break;
                    }
                }
                if (found)
                {
                    return loop;
                }
            }
            return NOT_FOUND;
        }
        public static string Substring(this StringBuilder theStringBuilder, int startIndex, int length)
        {
            return theStringBuilder == null ? null : theStringBuilder.ToString(startIndex, length);
        }
        public static bool AreEqual(this StringBuilder theStringBuilder, string compareString)
        {
            if (theStringBuilder == null)
            {
                return compareString == null;
            }
            if (compareString == null)
            {
                return false;
            }
            int len = theStringBuilder.Length;
            if (len != compareString.Length)
            {
                return false;
            }
            for (int loop = 0; loop < len; loop++)
            {
                if (theStringBuilder[loop] != compareString[loop])
                {
                    return false;
                }
            }
            return true;            
        }
        /// <summary>
        /// Compares one string to part of another string.
        /// </summary>
        /// <param name="haystack"></param>
        /// <param name="needle">Needle to look for</param>
        /// <param name="position">Looks to see if the needle is at position in haystack</param>
        /// <returns>Substring(theStringBuilder,offset,compareString.Length) == compareString</returns>
        public static bool IsStringAt(this StringBuilder haystack, string needle,int position)
        {
            if (haystack == null)
            {
                return needle == null;
            }
            if (needle == null)
            {
                return false;
            }
            int len = haystack.Length;
            int compareLen = needle.Length;
            if (len < compareLen + position)
            {
                return false;
            }
            for (int loop = 0; loop < compareLen; loop++)
            {
                if (haystack[loop+position] != needle[loop])
                {
                    return false;
                }
            }
            return true;
        }

    }
}

Ответ 4

IMHO вам не нужно использовать StringBuilder в этом случае... StringBuilder более полезен при использовании в цикле. Как и Microsoft, в В этой статье

Объект String неизменен. каждый время, когда вы используете один из методов в Класс System.String, вы создаете новый строковый объект в памяти, который требует нового распределения пространства для это новый объект. В ситуациях, когда вам необходимо выполнить повторную модификации строки, накладные расходы, связанные с созданием новый объект String может быть дорогостоящим. Класс System.Text.StringBuilder может быть используется, когда вы хотите изменить строку без создания нового объекта. Для пример, используя класс StringBuilder может повысить производительность, если объединяя много строк в петля

Итак, вы можете использовать String и избегать использования ToString()...