2009-11-18 2 views
5

Я пытаюсь манипулировать строкой, не выпуская из нее большую проблему и распространяя ее на несколько строк, поэтому я использую цепочку для достижения этой цели. Вопрос, который у меня есть, как использовать string.Substring(), чтобы удалить последний символ из моей строки в этом контексте?Использование string.Substring() как часть цепочки

В PHP я могу передать отрицательное число в качестве аргумента (т. Е. substr(-1)) для достижения этого, но, очевидно, это не так, как работает C#.

mystring = mystring.Replace('_', ' ').Substring(???);

Кроме того, что фактическое название используемого метода выше? Я всегда называл это цепочкой обратного вызова, но цепочка обратного вызова, о которой я сейчас думаю, является чем-то совершенно другим.

Пожалуйста, обратите внимание, я хочу избежать:

mystring = mystring.Replace('_', ' '); 
mystring = mystring.Substring(0, mystring.Length - 1); 

Заранее спасибо за ваше время и доброе внимание.

Iain

Спасибо за ответы. Забавно, что люди могут иметь такие сильные мнения о манипуляциях с строкой и других «конкурирующих» языках :)

+3

В чем проблема с использованием подстроки (0, length-1)? – Konamiman

+2

Длина объекта, вызываемого вызываемой подстрокой(), неизвестна при связывании методов. – Timbo

+0

О, дорогая, я подумал, что это могло быть так. Жаль только потому, что строка должна быть передана 'Substring()' для того, чтобы ее можно было манипулировать. Было бы не так уж много, чтобы позволить методам дальше по цепочке иметь доступ к своим свойствам. –

ответ

13

Вы можете написать метод расширения RightStrip(). Вы не можете перегружать SubString для отрицательных начальных позиций.

static string RightStrip(this string s, int n) 
{ 
    return s.Substring(0, s.Length - n); 
} 


string s = "Hello World!"; 
s = s.Replace('e', 'a').RightStrip(1); 
+0

Удлинительные методы и некоторые клейкие ленты, и вы можете сделать язык во всем, что это не так. +1, это единственное реальное решение этого вопроса. –

+0

Хорошее решение Хенк, мне это нравится и ваш пример. Очень жаль, что таких простых функций очень не хватает на языке :((string.Reverse() является еще одним из многих) –

0

Метод цепочки - это термин, который вы ищете. Это правда, что вы не можете передать негативный характер, как это, но вы можете приковать методы:

mystring = mystring.Replace('_', ' ').Substring(0, mystring.Length - 1); 

, так как строка замены в данном случае, не влияет на длину строки

+0

Как также объяснено Timbo, если оба аргумента Replace не имеют одинаковой длины, код неверен, так как он использует старую mystring.Length. –

+0

Не знаете, почему вы были остановлены, но да, я немного упростил свой пример, в цепочке есть другие методы, которые могут изменить длину. –

+0

Разве это не даст ему правильный выход, так как он не обрезает строку. mystring = mystring.Substring (0, mystring.Length - 1) .Replace ('_', ''); – jaywon

0

MyString = MyString .Reove ('_', '') .Remove (mystring.length -1)

Однако я бы подумал, что это плохая идея, поскольку назначение мистификации не происходит до тех пор, пока все манипуляции и изменение длины строки в предыдущих вызовах приведет к неожиданному поведению.

0

Для дальнейшего комментарий Konamiman в:

Просто потому, что PHP позволяет странно (и откровенно грязно и опасно) перегрузки и параметры, такие как отрицательные стартах и ​​подсчетов в подстроку, это не значит, что это правильно, правильно или надлежащим образом делать это.

Подстрока (0, mystring.Length - 1) - это de facto способ обрезки последнего символа строки на самых разных языках.

+0

Ничего особо грязного о негативных началах и подсчетах, это просто синтаксис. Как показано, он может сократить ваш код. Желательно или нет, это еще одно обсуждение. –

+0

Я не думаю, что согласен с тобой там. Как прокомментировал Tiberiu, аргумент, который вы делаете, касается синтаксиса, и хотя у PHP есть свои проблемы (ужасно непоследовательные имена функций являются только одним), он довольно хорош в манипулировании строками и может делать это с минимальным количеством кода.Я только начинаю в мире C#, и, хотя мне это очень нравится, до сих пор я нахожу некоторые действительно простые функции, которых очень не хватает. –

1

В вашем примере вы привязываетесь к методу, который не меняет длину исходной строки. Следовательно, ответы предполагают использование SubString с (originalLength-1), что, конечно же, не работает в общем случае.

Ответ, который вы, похоже, осознал, - вы не можете сделать это в общем случае, когда предыдущие методы в цепочке изменили длину.

Но вы можете написать свой собственный метод расширения в 3.5 делать то, что вы хотите. Что-то вроде следующего или его варианта:

public static string PhpSubstring(this string value, int length) 
{ 
    if (length < 0) length = value.Length - length; 
    return String.Substring(value, length); 
} 
+0

Как уже упоминалось выше, мой пример упрощен, правда, длина строки может быть изменена. для замешательства там. –

4

Создать класс расширения, как это:

public static class MyStringExtensions 
{ 
    public static string RemoveCharactersFromEnd(this string s, int n) 
    { 
     string result = string.Empty; 

     if (string.IsNullOrEmpty(s) == false && n > 0) 
     { 
      result = s.Remove(s.Length - n, n); 
     } 

     return result; 
    } 
} 

Называйте это:

Console.WriteLine("test!!".RemoveCharactersFromEnd(2));

1

Кроме того, все остальные упоминая термин метод цепочки , или то, что некоторые называют свободным интерфейсом, у меня была записка или два, которые я хотел добавить.

Что я хотел предложить, так это то, что классная вещь об методах расширения заключается в том, что вы можете легко определить свои собственные функции преобразования, которые чувствуют то же самое, что и это, включая системные методы, такие как Replace и ToLower и т. Д. .. что-то, что принимает какой-то ввод и возвращает какую-то преобразованную строку.

Конкретное преобразование вы просите (отрезать самый правый символ) может показаться неуклюжим, если вы должны использовать подстроки напрямую, но вы можете скрыть это прочь аккуратно в чем-то вроде:

public string CutOff(this string s, int c) 
{ 
    return s.Substring(0, s.Length - c); 
} 

. ..

return myVal.CutOff(1); 

(или, по крайней мере, я думаю, что это должно работать!)

удачи!

+0

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

0

Вы всегда можете использовать регулярное выражение:

mystring = new Regex("^(.*).$").Match(mystring.Replace('_', ' ')).Groups[1].Value; 

Кроме того, поскольку вы только собираетесь удалить этот последний символ, это не имеет значения, если это был '_', который получил заменен ' '. Это будет работать нормально:

mystring = mystring.Substring(0, mystring.Length - 1).Replace('_', ' '); 

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

  • Нет связанных вопросов^_^