Использование string.Substring () как часть цепочки - PullRequest
5 голосов
/ 18 ноября 2009

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

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

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

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

Обратите внимание, я хочу избежать:

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

Заранее спасибо за ваше время и любезность.

Иэн

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

Ответы [ 8 ]

13 голосов
/ 18 ноября 2009

Вы можете написать метод расширения 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);
4 голосов
/ 18 ноября 2009

Создайте класс расширения следующим образом:

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 голос
/ 18 ноября 2009

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

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

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

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

...

return myVal.CutOff(1);

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

Удачи!

1 голос
/ 18 ноября 2009

В вашем примере вы используете метод, который не меняет длину исходной строки. Отсюда ответы, предлагающие использовать 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 голосов
/ 18 ноября 2009

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

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

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

mystring = mystring.Substring(0, mystring.Length - 1).Replace('_', ' ');
0 голосов
/ 18 ноября 2009

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

То, что PHP допускает причудливые (и откровенно грязные и опасные) перегрузки и параметры, такие как отрицательные запуски и подсчеты в SubString, не означает, что это правильный, правильный или правильный способ сделать это.

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

0 голосов
/ 18 ноября 2009

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

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

0 голосов
/ 18 ноября 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...