C # TrimStart с параметром строкового массива: TrimStart(параметры string[] trimStrings)

#c# #string #extension-methods

#c# #строка #расширение-методы

Вопрос:

Я ищу методы расширения строки для TrimStart(params string[] trimStrings) и TrimEnd(params string[] trimStrings) которые принимают параметр string array.

Методы должны функционировать как TrimStart(params char[] trimChars) TrimEnd(params char[] trimChars) методы по умолчанию и . Т.Е. намерение состоит в том, чтобы обрезать все вхождения каждой (точно совпадающей) строки из массива trimStrings.

Было бы также неплохо добавить опцию обрезки без учета регистра.

Каков был бы оптимальный способ реализации такого метода? Пожалуйста, посмотрите мою попытку ниже.

Комментарии:

1. Не сайт запроса кода. Сначала вам нужно хотя бы попытаться их реализовать.

2. Я думаю, вы ищете rentacoder.com .

3. Я изменил вопрос в конце.

4. Это все еще не делает его хорошим вопросом для SO без вашей попытки.

5. Вы понимаете, чего вы действительно хотите? Как это должно работать на самом деле? Каким должен быть результат «обрезки данных». TrimStart(«обрезка», «обрезка»)?

Ответ №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) amp;amp; 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"
 

Ответ №2:

Мое решение:

 public static string TrimStart(this string target, StringComparison comparisonType, params string[] trimStrings)
{
    string result = target;
    if (trimStrings == null)
        return resu<
    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 resu<
}

public static string TrimEnd(this string target, StringComparison comparisonType, params string[] trimStrings)
{
    string result = target;
    if (trimStrings == null)
        return resu<
    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 resu<
}
 

Комментарии:

1. Теперь, когда вы показали свой подход, в чем проблема? Вы должны упомянуть о проблеме. Работает ли это так, как ожидалось, медленно, нечитаемо, есть ли у вас какие-либо проблемы? В противном случае это не настоящий вопрос, но, возможно, кандидат на codereview.stackexchange.com .