用string参数C#TrimStart
我正在寻找接受string参数的TrimStart()
和TrimEnd()
string扩展方法。
我可以自己创build一个,但是我总是对看到其他人做事情感兴趣。
如何才能做到这一点?
TrimStart:
public static string TrimStart(this string target, string trimChars) { return target.TrimStart(trimChars.ToCharArray()); }
TrimEnd:
public static string TrimEnd(this string target, string trimChars) { return target.TrimEnd(trimChars.ToCharArray()); }
请注意,这个函数会从目标的开始/结束处修剪trimChars中的任何字符,例如"foobar;'@".TrimEnd(";@'")
将返回"foobar"
如果意图是修剪(完全匹配)string的所有匹配,那么应该使用类似下面的内容:
TrimStart:
public static string TrimStart(this string target, string trimString) { string result = target; while (result.StartsWith(trimString)) { result = result.Substring(trimString.Length); } return result; }
TrimEnd:
public static string TrimEnd(this string target, string trimString) { string result = target; while (result.EndsWith(trimString)) { result = result.Substring(0, result.Length - trimString.Length); } return result; }
TrimStart和TrimEnd接受一个字符数组。 这意味着你可以传入一个string作为一个char数组,像这样:
var trimChars = " .+-"; var trimmed = myString.TrimStart(trimChars.ToCharArray());
所以我看不到需要一个string参数的重载。
我以为这个问题是从一个更大的string开始修剪一个特定的string。
例如,如果我有string“hellohellogoodbyehello”,如果你试图调用TrimStart(“hello”),你会得到“goodbyehello”。
如果是这样的话,你可以使用如下代码:
string TrimStart(string source, string toTrim) { string s = source; while (s.StartsWith(toTrim)) { s = s.Substring(toTrim.Length - 1); } return s; }
如果你需要做大量的string修剪,这将不是超级高效的,但是如果仅仅是less数情况下,它很简单并且完成工作。
从dotnetperls.com ,
性能
不幸的是,TrimStart方法没有大量优化。 在特定的情况下,你可能会写出可以胜过它的基于字符的迭代代码。 这是因为必须创build一个数组才能使用TrimStart。
但是:自定义代码不一定需要数组。 但是对于快速开发的应用程序,TrimStart方法很有用。
在C#中没有内置函数,但是可以编写自己的扩展,其行为与您期望的完全相同。
请注意,使用IndexOf / LastIndexOf ,您可以select是否区分大小写/文化敏感。
我也实现了“重复修剪”function。
有一个函数TrimStr(..)
处理两个修剪,加上三个函数实现.TrimStart(...)
.TrimEnd(...)
和.Trim(..)
与.NET修剪的兼容性:
在DotNetFiddle中尝试
public static class Extension { public static string TrimStr(this string str, string trimStr, bool trimEnd = true, bool repeatTrim = true, StringComparison comparisonType = StringComparison.OrdinalIgnoreCase) { int strLen; do { if (!(str ?? "").EndsWith(trimStr)) return str; strLen = str.Length; { if (trimEnd) { var pos = str.LastIndexOf(trimStr, comparisonType); if ((!(pos >= 0)) || (!(str.Length - trimStr.Length == pos))) break; str = str.Substring(0, pos); } else { var pos = str.IndexOf(trimStr, comparisonType); if (!(pos == 0)) break; str = str.Substring(trimStr.Length, str.Length - trimStr.Length); } } } while (repeatTrim && strLen > str.Length); return str; } // the following is C#6 syntax, if you're not using C#6 yet // replace "=> ..." by { return ... } public static string TrimEnd(this string str, string trimStr, bool repeatTrim = true, StringComparison comparisonType = StringComparison.OrdinalIgnoreCase) => TrimStr(str, trimStr, true, repeatTrim, comparisonType); public static string TrimStart(this string str, string trimStr, bool repeatTrim = true, StringComparison comparisonType = StringComparison.OrdinalIgnoreCase) => TrimStr(str, trimStr, false, repeatTrim, comparisonType); public static string Trim(this string str, string trimStr, bool repeatTrim = true, StringComparison comparisonType = StringComparison.OrdinalIgnoreCase) => str.TrimStart(trimStr, repeatTrim, comparisonType) .TrimEnd(trimStr, repeatTrim, comparisonType); }
现在你可以像使用它一样
Console.WriteLine("Sammy".TrimEnd("my")); Console.WriteLine("moinmoin gibts gips? gips gibts moin".TrimStart("moin", false)); Console.WriteLine("moinmoin gibts gips? gips gibts moin".Trim("moin").Trim());
从而创build输出
山姆
moin gibts gips? gips gibts moin
gibts gips? gips gibts
我假设你的意思是,例如,给定string“HelloWorld”,并调用函数以“修剪”开始“你好”,你会留下“世界”。 我认为,这是一个真正的子string操作,因为您要删除已知长度的string的一部分,而不是删除未知长度的string的修剪操作。
就这样,我们创build了一些名为SubstringAfter
和SubstringBefore
的扩展方法。 把它们放在框架中是很好的,但是它们不是那么需要你自己去实现它们。 不要忘记拥有一个StringComparison
参数,并且如果使它成为可选的,则使用Ordinal
作为默认参数。
如果你确实想要一个没有使用内置的修剪function出于任何原因,假设你想要一个inputstring用于修剪,如“〜!” 与['','〜','!']内置的TrimStart基本相同
public static String TrimStart(this string inp, string chars) { while(chars.Contains(inp[0])) { inp = inp.Substring(1); } return inp; } public static String TrimEnd(this string inp, string chars) { while (chars.Contains(inp[inp.Length-1])) { inp = inp.Substring(0, inp.Length-1); } return inp; }