2012-06-12 4 views
5

Для удаления трейлинга части я использую кодЕсть ли лучший способ удалить конечную часть строки в .NET?

str.substring(0,str.length -2) 

Есть ли лучший способ? Мне особенно не нравится использование str.length.

Редактировать Я хотел, чтобы вопрос был как можно более коротким и простым, и я предположил, что я просто упустил какой-то метод String. Я стараюсь быть более точным.

Мне нужно удалить заданное количество символов из конца строки. Я не хочу заботиться о том, что такое персонажи, и я не хочу вводить риск удаления большего количества персонажей.

Если число больше, чем длина строки, давайте создадим исключение (строка должна быть проверена ранее).

У меня нет проблемы, особенно с длиной, но с ссылкой на переменную дважды (представьте функцию вместо переменной). Мне также не нравится необходимость вычитания, но это только личное предпочтение.

VB.NET soution

Вопрос TAged vb.net так есть vb.net код (должен быть в модуле):

<System.Runtime.CompilerServices.Extension> _ 
Public Shared Function RemoveFromEnd(stringValue As String, removedCharacters As Integer) As String 
    Return stringValue.Substring(0, stringValue.Length - removedCharacters) 
End Function 
+1

Что вы подразумеваете под 'trailing part'? – dtsg

+3

Чтобы удалить последние символы x строки, вы должны знать ее длину. Если вам просто не нравится видеть это в коде, вы можете написать метод расширения, чтобы скрыть вычисление. –

+0

@Duane: Я имею в виду удаление последних символов x. – IvanH

ответ

8

Если ваша проблема является просто эстетика, что вы смотрите, это тривиально, чтобы обернуть эту функцию в метод расширения:

public static string RemoveFromEnd(this string stringValue, int removedCharacters) 
    { 
     return stringValue.Substring(0, stringValue.Length - removedCharacters); 
    } 

Таким образом, вы могли бы просто использовать

str.RemoveFromEnd(2); 

и сделайте это.

Если вы беспокоитесь о производительности использования string.length из-за его репутации за медленную работу на неуправляемых языках, не следует. Поскольку строки в .Net неизменяемы, String.Length устанавливается, когда строка объявлена ​​и никогда не изменяется. Поэтому ссылка на String.Length завершается в постоянным времени (например, Big-O (1)) и очень быстро. Напротив, вместо этого вы должны сосредоточиться на вызове подстроки, если вы чувствительны к производительности. В .Net подстрока завершается в линейном времени (например, Big-O (n)), где n - длина исходной строки. Поэтому это узкое место в вашей линии кода. Он будет медленнее по отношению к длине строки.

Если вы имеете дело с очень длинными строками, может быть, не все в порядке, чтобы просто проглотить это. Чтобы обойти что-то вроде этого вы должны использовать StringBuilder в методе расширения вместо:

public static string RemoveFromEnd(this string stringValue, int removedCharacters) 
    { 
     var newString = new StringBuilder(stringValue); 
     newString.Length = newString.Length - removedCharacters; 
     return newString.ToString(); 
    } 

Это все должно быть постоянное время, но мне нужно перепроверить отражатель, чтобы убедиться, что StringBuilder.Length ведет себя так, как я думаю, что это делает. Тем не менее, даже если это линейное время, оно будет линейным относительно удаленных символов, что обязательно будет ниже длины исходной строки. Очевидно, компромисс заключается в том, что у вас немного больше использования памяти до тех пор, пока StringBuilder не выйдет из области видимости, но это не должно быть проблемой, если вы обернете его в метод расширения, который завершается очень быстро.

EDIT: Да, StringBuilder.Length просто возвращает String.Length строки, которую он отслеживает, так что возврат в постоянное время и подход StringBuilder к усечению должны быть такими быстрыми, насколько это возможно.

+0

Интересно. Я думал, что 'StringBulider.Length' является свойством get-only, но я вижу, что вы правы, это get/set. При увеличении 'Length' будет добавлено много символов' '\ 0''. Интересно, когда вы когда-нибудь захотите этого ... –

+0

@JeppeStigNielsen Когда вы готовитесь выгружать кучу вещей в строитель все по частям и не хотите, чтобы предмет постоянно перераспределял базовую структуру данных. Вам нужно будет использовать индексную переменную, а некоторые другие вещи, которые я бы утверждал, как правило, слишком сложны и нечитабельны, чтобы быть полезными, но если производительность становится большим соображением, вам просто придется полагаться на волшебство комментариев. – tmesser

+0

Когда я задал вопрос, меня интересовала эстетика, но я также ценю информацию о производительности. Есть ли у вас оценка длины, для которой лучше использовать StringBuilder? – IvanH

0

Это зависит от того, что вы имеете в виду «конечная часть». Вы имеете в виду пробелы после контента? Так, например:

string test = "This is a test string. "; // But you want "This is a test string." 

и вы хотите удалить пробелы после? Это возможно с помощью команд .Trim() или .TrimEnd(). Если вы не имеете в виду это, укажите, в чем проблема.

+0

Мне нужно удалить произвольные символы (а не просто пробелы или указанные символы). – IvanH

+0

Это не ответило на вопрос, но вы правильно его квалифицировали. Не заслужил ни единого голоса. +1, чтобы получить вас. – Paparazzi

+0

Спасибо Blam. Я думаю, что это довольно рискованный ответ на неясные/неопределенные вопросы. Я действительно думал, что это самый вероятный вопрос. – pyrocumulus

0
 var test = " test"; 
     // Trim all trailing spaces 
     test = test.Trim(); 
     // Trim only starting trailing spaces 
     test = test.TrimStart(); 
     // Trim only ending trailing spaces 
     test = test.TrimEnd(); 


     var test = "abcTest"; 
     // Trim all trailing abc 
     var toRemove = new char[3]; 
     toRemove[0] = 'a'; 
     toRemove[1] = 'b'; 
     toRemove[2] = 'c'; 
     test = test.TrimStart(toRemove); 

Вы должны использовать функцию TRIM() для удаления роспускной Части

+0

Мне нужно удалить произвольные символы (а не просто пробелы или указанные символы). – IvanH

+0

Trim, TrimStart и TrimEnd имеют перегрузки, где вы можете передать char [] с произвольными символами для удаления. Вот определение: «Строка, которая остается после всех вхождений символов в параметре trimChars, удаляется с начала текущей строки. Если trimChars имеет значение null или пустой массив, вместо этого удаляются символы пробела». http://msdn.microsoft.com/en-us/library/system.string.trimstart.aspx –

+1

«Произвольные символы» означает, что он хочет удалить последние два символа, независимо от того, что они представляют. Ваше предлагаемое решение потребует, чтобы он передал 'char []', который содержит все возможные символы, - все из 65 536 из них. –

5

Проверьте этот родственный вопрос:

Trim string from the end of a string in .NET - why is this missing?

Поскольку нет встроенного метода, чтобы сделать это, вам необходимо будет сделать свой собственный метод (предпочтительно метод расширения):

public static string RemoveCharsFromEnd(this string input, int charactersToRemove) 
{ 
    if (input.Length > charactersToRemove) 
     return input.substring(0, input.Length - charactersToRemove); 
    else 
     return ""; 
} 
+0

+1 для рассмотрения случая, когда вся строка должна быть удалена. – MarkJ

+0

Этот ответ хорош, но принятый ответ более точный. Я особенно ценю ссылку на другой вопрос (с другим принятым ответом), которого я не нашел. – IvanH

3

Так же существует способ, чтобы удалить первые 2 символы из строки без использования str.Length, а именно

str.Substring(2) 

и поэтому вы спросите, как сделать это с другого конца? Я не думаю, что рамки предлагают это. Вы можете использовать

str.Remove(str.Length - 2) 

но это использует Length.

Вот уродливый способ, который использует Linq и имеет плохую производительность:

new string(str.Reverse().Skip(2).Reverse().ToArray()) 

Уродливая идея не бросать исключения, когда строка слишком коротка.

+0

Творчество, проголосовавшее здесь :-) –

+0

Он ответил на вопрос +1. Я лично не понимаю, почему вопрос подлежит голосованию, но ответы пропущены. – Paparazzi

+0

@Blam спасибо. –

Смежные вопросы