带字符串数组参数的C#TrimStart:TrimStart(params string [] trimStrings)

时间:2014-06-26 11:33:43

标签: c# string extension-methods

我在寻找TrimStart(params string[] trimStrings)的字符串扩展方法 和TrimEnd(params string[] trimStrings)接受字符串数组参数。

方法应该像默认的TrimStart(params char[] trimChars)TrimEnd(params char[] trimChars)方法一样运行。 IE浏览器。目的是修剪trimStrings数组中每个(完全匹配的)字符串的所有出现。

添加一个不区分大小写的修剪选项也很不错。

实施此类方法的最佳方法是什么? 请参阅下面的尝试。

2 个答案:

答案 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;
}