Как заменить указанный адрес электронной почты значением в заданном вводе?

Я написал приведенный ниже метод для замены некоторых почтовых доменов, таких как @ gmail.com и @ yahoo.com, заданным текстом.

public static string RemovePersonalInfo(string input)
{
    string[] tokens = input.Split(new char[] { ' ', 't', 'r', 'n' });
    string output = string.Empty;
    foreach (string token in tokens)
    {
        if (token.Contains("@gmail.com"))
        {
            output += " SOMETEXT";
        }
        else
        {
            output += " " + token;
        }
    }
    tokens = output.Split(new char[] { ' ', 't', 'r', 'n' });
    output = string.Empty;
    foreach (string token in tokens)
    {
        if (token.Contains("@yahoo.com"))
        {
            output += " SOMETEXT";
        }
        else
        {
            output += " " + token;
        }
    }
    return output;
}

Он работает, как ожидалось, для ввода ниже.

Но я не думаю, что это хорошее решение, я вижу улучшения в коде, как будто он не масштабируется, давайте посмотрим, завтра придет другой домен электронной почты, мне придется снова изменить код и написать другой if условие. Второе улучшение заключается в том, что я запускаю цикл дважды, это можно сделать за один цикл. так что производительность может быть улучшена.

Или, если есть лучший подход, пожалуйста, предложите.

Вход: test@gmail.com test@abc.com @ teest @ yahoo.com

выход: SOMETEXT test@abc.com SOMETEXT

Примечание: Я не должен использовать Replace метод. Таким образом, единственное намерение здесь — использовать ту же логику и в основных языках программирования, таких как C и C ++.

1 ответ
1

  • С точки зрения производительности при использовании конкатенации строк (output += ) внутри цикла — не лучший выбор, потому что для каждого output += создается новая строка, потому что строки неизменяемы. Используя StringBuilder будет путь пойти. Но вместо того, чтобы вернуть string, ты мог вернуть IEnumerable<string> который было бы сделать код более гибким.

  • Прохождение IEnumerable<string> как параметр метода, содержащий нежелательные домены, сделает код открытым для необходимых изменений.

  • Прохождение IEnumerable<string> поскольку параметр метода, содержащий токены, позволит методу выполнять только одно действие.

  • Потому что метод public у вас должна быть правильная проверка параметров.

  • Использование небольшого количества Linq сильно сжало бы код.

  • Вместо жесткого кодирования «SOMETEXT» вы можете передать необязательный параметр.

Внедрение указанных изменений с использованием string поскольку возвращаемый тип приведет к

public static string RemovePersonalInfo(string input)
{
    if (input == null) { throw new NullReferenceException(nameof(input)); }
    if (string.IsNullOrWhiteSpace(input)) { return input; }

    return RemovePersonalInfo(input.Split(new char[] { ' ', 't', 'r', 'n' }), new string[] { "@gmail.com", "@yahoo.com" });

}
private static string RemovePersonalInfo(IEnumerable<string> tokens, IEnumerable<string> domains, string replacement = "SOMETEXT")
{
    return string.Join(" ", tokens.Select(token => (domains.Any(domain => token.Contains(domain)) ? replacement : token)));
}  

и может называться как раньше.

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *