Я написал приведенный ниже метод для замены некоторых почтовых доменов, таких как @ 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 ответ
С точки зрения производительности при использовании конкатенации строк (
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)));
}
и может называться как раньше.