使用string.Substring()作为链的一部分

时间:2009-11-18 07:52:07

标签: c# string chaining

我正在尝试操作一个字符串而不会产生大问题并将其分散到多行,所以我正在使用一些链接来实现这一点。我的问题是,如何使用string.Substring()删除字符串中的最后一个字符

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

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

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

请注意我要避免:

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

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

伊恩

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

8 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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));

答案 2 :(得分: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);
}

答案 3 :(得分:1)

除了提到术语链接这个术语的所有人,或者有人称之为流畅的界面之外,我还有一两个想要添加的注释。

我想建议的是,扩展方法的酷炫之处在于您可以轻松定义自己的转换函数类型,感觉与此相同,包括系统方法,如Replace和ToLower等等......需要一些输入并返回某种变换字符串的东西。

如果你必须直接使用Substring,你要求的特定转换(切掉最右边的字符)可能看起来很笨拙,但是你可以把它隐藏起来,如:

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

...

return myVal.CutOff(1);

(或者至少,我认为这应该有效!)

祝你好运!

答案 4 :(得分:0)

方法链接是您正在寻找的术语。确实,你不能传递这样的负面角色,但你仍然可以链接方法:

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

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

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

进一步发现Konamiman的评论:

仅仅因为PHP允许奇怪的(并且非常脏和危险)重载和参数,例如负启动和SubString中的计数,这并不意味着它是正确,正确或正确的方式。

Substring(0,mystring.Length - 1)是以各种语言修剪字符串的最后一个字符的事实上的方法。

答案 7 :(得分:0)

您可以随时使用正则表达式:

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

此外,由于您只是要删除最后一个字符,因此'_'' '取代并不重要。这样可以正常工作:

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