我在寻找TrimStart(params string[] trimStrings)
的字符串扩展方法
和TrimEnd(params string[] trimStrings)
接受字符串数组参数。
方法应该像默认的TrimStart(params char[] trimChars)
和TrimEnd(params char[] trimChars)
方法一样运行。 IE浏览器。目的是修剪trimStrings数组中每个(完全匹配的)字符串的所有出现。
添加一个不区分大小写的修剪选项也很不错。
实施此类方法的最佳方法是什么? 请参阅下面的尝试。
答案 0 :(得分:1)
即使你的问题不是一个问题,而是一个规范我已经试过了。
这是我的TrimStart
,您可以自由撰写TrimEnd
;)
public static string TrimStart(this string str, StringComparison comparison = StringComparison.CurrentCulture, params string[] trimStrings)
{
if (str == null) return null;
// Check the longest strings first and check only relevant strings
List<string> orderedTrimStrings = trimStrings
.Where(ts => !String.IsNullOrEmpty(ts) && ts.Length <= str.Length)
.OrderByDescending(ts => ts.Length)
.ToList();
int minLength = orderedTrimStrings.Last().Length;
for (int i = 0; i + minLength <= str.Length;)
{
string longestTrim = orderedTrimStrings
.Where(ts => i + ts.Length <= str.Length)
.FirstOrDefault(ts => str.Substring(i, ts.Length).Equals(ts, comparison));
if (longestTrim == null)
return str.Substring(i);
else
i += longestTrim.Length;
}
return "";
}
请注意,它尚未经过测试,以下是一个有效的示例:
string hw = "Hello World";
hw = hw.TrimStart(StringComparison.CurrentCultureIgnoreCase, "hello", " ");
// "World"
答案 1 :(得分:0)
我的解决方案:
public static string TrimStart(this string target, StringComparison comparisonType, params string[] trimStrings)
{
string result = target;
if (trimStrings == null)
return result;
var _trimStrings = trimStrings.OrderByDescending(t => t.Length).ToList();
bool trimmed = false;
do
{
trimmed = false;
foreach (var trimString in _trimStrings)
{
while (result.StartsWith(trimString, comparisonType))
{
result = result.Substring(trimString.Length);
trimmed = true;
}
}
} while (trimmed);
return result;
}
public static string TrimEnd(this string target, StringComparison comparisonType, params string[] trimStrings)
{
string result = target;
if (trimStrings == null)
return result;
var _trimStrings = trimStrings.OrderByDescending(t => t.Length).ToList();
bool trimmed = false;
do
{
trimmed = false;
foreach (var trimString in _trimStrings)
{
while (result.EndsWith(trimString, comparisonType))
{
result = result.Substring(0, result.Length - trimString.Length);
trimmed = true;
}
}
} while (trimmed);
return result;
}