C# - Самый простой способ удалить первое вхождение подстроки от другой строки

Я должен удалить первое (и ТОЛЬКО первое) возникновение строки от другой строки.

Вот пример, заменяющий строку "\\Iteration". Это:

ProjectName\\Iteration\\Release1\\Iteration1

стал бы этим:

ProjectName\\Release1\\Iteration1

Здесь некоторый код, который делает это:

const string removeString = "\\Iteration";
int index = sourceString.IndexOf(removeString);
int length = removeString.Length;
String startOfString = sourceString.Substring(0, index);
String endOfString = sourceString.Substring(index + length);
String cleanPath = startOfString + endOfString;

Это походит на большое количество кода.

Таким образом, мой вопрос - это: существует ли более чистый/больше читаемый/больше краткий способ сделать это?

72
задан Cœur 30 April 2017 в 14:53
поделиться

5 ответов

int index = sourceString.IndexOf(removeString);
string cleanPath = (index < 0)
    ? sourceString
    : sourceString.Remove(index, removeString.Length);
131
ответ дан 24 November 2019 в 12:30
поделиться

Написал быстрый тест TDD для этого

    [TestMethod]
    public void Test()
    {
        var input = @"ProjectName\Iteration\Release1\Iteration1";
        var pattern = @"\\Iteration";

        var rgx = new Regex(pattern);
        var result = rgx.Replace(input, "", 1);

        Assert.IsTrue(result.Equals(@"ProjectName\Release1\Iteration1"));
    }

rgx.Replace (input, "", 1); говорит искать во вводе все, что соответствует шаблону, с "", 1 раз.

10
ответ дан 24 November 2019 в 12:30
поделиться

Вам нужна ширина: * Поплавок должен иметь явную ширину (назначенную свойством 'width', или его внутреннюю ширину в случае заменяемых элементов). *

через: W3C

-121--4076893-

Вы можете Это похоже на использование сеанса, за исключением того, что он доступен только для каждого запроса, а не для всего времени жизни сеанса.

http://www.4guysfromrolla.com/articles/060904-1.aspx

, по моему скромному мнению, это немного лениво, но это могло бы быть хорошее решение в некоторых ситуациях.

-121--1515935-

Для развлечения можно использовать метод расширения . Обычно я не рекомендую присоединять методы расширения к такому классу общего назначения, как последовательность, но, как я сказал, это весело. Я позаимствовал ответ @ Luke, так как нет смысла заново изобретать колесо.

[Test]
public void Should_remove_first_occurrance_of_string() {

    var source = "ProjectName\\Iteration\\Release1\\Iteration1";

    Assert.That(
        source.RemoveFirst("\\Iteration"),
        Is.EqualTo("ProjectName\\Release1\\Iteration1"));
}

public static class StringExtensions {
    public static string RemoveFirst(this string source, string remove) {
        int index = source.IndexOf(remove);
        return (index < 0)
            ? source
            : source.Remove(index, remove.Length);
    }
}
6
ответ дан 24 November 2019 в 12:30
поделиться

Я определенно согласен с тем, что это идеально подходит для метода расширения, но я думаю, что его можно немного улучшить.

public static string Remove(this string source, string remove,  int firstN)
    {
        if(firstN <= 0 || string.IsNullOrEmpty(source) || string.IsNullOrEmpty(remove))
        {
            return source;
        }
        int index = source.IndexOf(remove);
        return index < 0 ? source : source.Remove(index, remove.Length).Remove(remove, --firstN);
    }

Это немного рекурсии, что всегда весело.

Вот и простой модульный тест:

   [TestMethod()]
    public void RemoveTwiceTest()
    {
        string source = "look up look up look it up";
        string remove = "look";
        int firstN = 2;
        string expected = " up  up look it up";
        string actual;
        actual = source.Remove(remove, firstN);
        Assert.AreEqual(expected, actual);

    }
2
ответ дан 24 November 2019 в 12:30
поделиться
string myString = sourceString.Remove(sourceString.IndexOf(removeString),removeString.Length);

РЕДАКТИРОВАТЬ: @OregonGhost прав. Я сам разбивал сценарий на условные обозначения, чтобы проверить наличие такого случая, но я работал в предположении, что строки были даны как принадлежащие друг другу по какому-то требованию. Возможно, ожидается, что бизнес-правила обработки исключений уловят эту возможность. Я бы сам использовал пару дополнительных строк для выполнения условных проверок, а также чтобы сделать его немного более читабельным для младших разработчиков, которые не могут найти время, чтобы прочитать его достаточно внимательно.

24
ответ дан 24 November 2019 в 12:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: