【发布时间】:2014-01-02 09:45:35
【问题描述】:
10 次中有 9 次,当我想对字符串使用 Substring() 方法时,这是因为我想从字符串的 END 而不是开始处刮掉一些字符。虽然默认的 Substring 确实支持这一点,但它通过采用第二个参数来实现,该参数是所需字符串的长度,而不是端点。这意味着如果我一直想从一系列不同长度的字符串中删除 N 个字符,我必须做一个额外的步骤,这可能会产生更多的代码。举个例子:
//Shaving the first N chars
string trimmed = foo.bar.widget.GetType().Name.Substring(N);
对比
//Shaving the last N chars
string trimmed = foo.bar.widget.GetType().Name.Substring(0, foo.bar.widget.GetType().Name.Length - N);
或者为了节省额外的函数调用,使用第二行:
string name = foo.bar.widget.GetType().Name;
string trimmed = name.Substring(0, name.Length - N);
无论哪种方式,您基本上都将需要从字符串末尾而不是开头删除字符的代码量增加了一倍。我的修改会很简单。如果你传递一个负数 N(否则这将毫无意义),它会将 -N 字符从字符串的末尾而不是开头剃掉。我已经可以使用扩展方法对其进行编码了:
public static string MySubstring(this string str, int val)
{
return (val > 0) ? str.Substring(val) : str.Substring(0, str.Length + val);
}
然后当我想剃掉最后的 N 个字符时,我就这样做了:
string trimmed = foo.bar.widget.GetType().Name.MySubstring(-N);
短而甜,就像剃掉开头的字符一样。我的问题是 - 是否可以覆盖默认 Substring() 函数的行为,以便我可以做到这一点而不必为函数使用我自己的唯一名称?它不会使任何现有代码无效,因为以前没有理由将负数传递给它,这样做只会引发异常并崩溃。这只是那些简单的、严肃的功能之一,感觉它应该从一开始就成为实现的一部分。
【问题讨论】:
标签: c# string substring extension-methods