5

我试图操纵一个字符串,而不是让它成为一个大问题并将它分散到多行,所以我使用一些链接来实现这一点。我的问题是,在这种情况下,如何使用string.Substring()从字符串中删除最后一个字符?

在 PHP 中,我可以传递一个负数作为参数(即substr(-1))来实现这一点,但显然这不是 C# 的工作方式。

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

另外,上面使用的技术的实际名称是什么?我一直把它称为回调链,但我现在认为回调链完全不同。

请注意我想避免:

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

提前感谢您的时间和善意的考虑。

伊恩

谢谢你们的回答。有趣的是,人们对字符串操作和其他“竞争”语言有如此强烈的看法:)

4

8 回答 8

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);
于 2009-11-18T08:03:03.357 回答
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));

于 2009-11-18T08:10:21.173 回答
1

在您的示例中,您链接到一个不会更改原始字符串长度的方法。因此答案建议使用带有 (originalLength-1) 的 SubString,这在一般情况下当然不起作用。

您似乎已经意识到的答案是 - 在一般情况下您不能这样做,链中以前的方法已经修改了长度。

但是你可以在 3.5 中编写自己的扩展方法来做你想做的事。类似于以下内容或其变体:

public static string PhpSubstring(this string value, int length)
{
    if (length < 0) length = value.Length - length;
    return String.Substring(value, length);
}
于 2009-11-18T08:05:02.687 回答
1

除了其他人都提到术语方法链,或者有些人称之为流利的接口之外,我还有一两点想要补充。

我想建议的是,扩展方法很酷的一点是,您可以轻松定义自己的与此相同的转换函数类型,包括 Replace 和 ToLower 等系统方法......输入并返回某种转换后的字符串。

如果您必须直接使用 Substring,您要求的特定转换(切断最右边的字符)可能看起来很笨重,但您可以将其巧妙地隐藏在以下内容中:

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

...

return myVal.CutOff(1);

(或者至少,我认为这应该可行!)

祝你好运!

于 2009-11-18T08:11:56.120 回答
0

方法链是您正在寻找的术语。确实,您不能传递这样的否定字符,但您仍然可以链接方法:

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

由于在这种情况下字符串替换,不会影响字符串的长度

于 2009-11-18T07:59:59.590 回答
0

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

但是,我认为这是一个坏主意,因为 mystring 的分配要等到之前调用中字符串长度的所有操作和更改将导致意外行为之后才会发生。

于 2009-11-18T08:01:25.143 回答
0

进一步 Konamiman 的评论:

仅仅因为 PHP 允许奇怪的(坦率地说是肮脏和危险的)重载和参数,例如 SubString 中的负开始和计数,并不意味着它是正确、正确或正确的方法。

Substring(0, mystring.Length - 1) 是在多种语言中修剪字符串最后一个字符的实际方法。

于 2009-11-18T08:02:52.347 回答
0

你总是可以使用正则表达式:

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

'_'此外,由于您只是要删除最后一个字符,因此它是否被替换为a 也没关系' '。这会很好用:

mystring = mystring.Substring(0, mystring.Length - 1).Replace('_', ' ');
于 2009-11-18T08:20:28.360 回答