С#:Как добавить текст к каждой строке строки?
-
13-09-2019 - |
Вопрос
Как будет выглядеть реализация MagicFunction, чтобы пройти следующий тест (nunit)?
public MagicFunction_Should_Prepend_Given_String_To_Each_Line()
{
var str = @"line1
line2
line3";
var result = MagicFunction(str, "-- ");
var expected = @"-- line1
-- line2
-- line3";
Assert.AreEqual(expected, result);
}
Решение 8
Спасибо всем за ваши ответы.Я реализовал MagicFunction как метод расширения.Он использует ответ Томаса Левеска, но улучшен для работы со всеми основными средами И предполагает, что вы хотите, чтобы выходная строка использовала тот же признак конца новой строки, что и входная строка.
Я отдал предпочтение ответу Томаса Левеска (а не ответам Спенсера Рупорта, Фредрика Морка, Лазаруса и Дж. Данкерли), потому что он показал наилучшие результаты.Я опубликую результаты производительности в своем блоге и дам ссылку здесь позже для тех, кто заинтересован.
(Очевидно, что имя функции MagicFunctionIO следует изменить.Я выбрал «PrependEachLineWith»)
public static string MagicFunctionIO(this string self, string prefix)
{
string terminator = self.GetLineTerminator();
using (StringWriter writer = new StringWriter())
{
using (StringReader reader = new StringReader(self))
{
bool first = true;
string line;
while ((line = reader.ReadLine()) != null)
{
if (!first)
writer.Write(terminator);
writer.Write(prefix + line);
first = false;
}
return writer.ToString();
}
}
}
public static string GetLineTerminator(this string self)
{
if (self.Contains("\r\n")) // windows
return "\r\n";
else if (self.Contains("\n")) // unix
return "\n";
else if (self.Contains("\r")) // mac
return "\r";
else // default, unknown env or no line terminators
return Environment.NewLine;
}
Другие советы
string MagicFunction(string str, string prepend)
{
str = str.Replace("\n", "\n" + prepend);
str = prepend + str;
return str;
}
РЕДАКТИРОВАТЬ:
Как отмечали другие, символы новой строки различаются в зависимости от среды.Если вы планируете использовать эту функцию только для файлов, созданных в той же среде, System.Environment будет работать нормально.Однако если вы создаете файл в системе Linux, а затем переносите его в систему Windows, вам потребуется указать другой тип новой строки.Поскольку Linux использует
, а Windows использует
, этот фрагмент кода будет работать как для файлов Windows, так и для Linux.Если вы добавляете к этому компьютеры Mac (
), вам придется придумать что-то более сложное.
private static string MagicFunction(string str, string prefix)
{
string[] lines = str.Split(new[] { '\n' });
return string.Join("\n", lines.Select(s => prefix + s).ToArray());
}
Как насчет:
string MagicFunction(string InputText) {
public static Regex regex = new Regex(
"(^|\\r\\n)",
RegexOptions.IgnoreCase
| RegexOptions.CultureInvariant
| RegexOptions.IgnorePatternWhitespace
| RegexOptions.Compiled
);
// This is the replacement string
public static string regexReplace =
"$1-- ";
// Replace the matched text in the InputText using the replacement pattern
string result = regex.Replace(InputText,regexReplace);
return result;
}
var result = "-- " + str.Replace(Environment.NewLine, Environment.NewLine + "-- ");
если вы хотите, чтобы он работал как с Windows ( ) NewLines, так и с Unix ( ), тогда:
var result = "-- " + str.Replace("\n", "\n-- ");
Нет необходимости трогать , поскольку он должен остаться там, где был раньше.Однако, если вы хотите перейти между Unix и Windows, тогда:
var result = "-- " + str.Replace("\r","").Replace("\n", Enviornment.NewLine + "-- ");
Сделаем это и вернем результат в формате локальной ОС.
Вы могли бы сделать это так:
public string MagicFunction2(string str, string prefix)
{
bool first = true;
using(StringWriter writer = new StringWriter())
using(StringReader reader = new StringReader(str))
{
string line;
while((line = reader.ReadLine()) != null)
{
if (!first)
writer.WriteLine();
writer.Write(prefix + line);
first = false;
}
return writer.ToString();
}
}
Вы можете разделить строку по Environment.NewLine, а затем добавить префикс к каждой из этих строк, а затем соединить их по Environment.NewLine.
string MagicFunction(string prefix, string orignalString)
{
List<string> prefixed = new List<string>();
foreach (string s in orignalString.Split(new[]{Environment.NewLine}, StringSplitOptions.None))
{
prefixed.Add(prefix + s);
}
return String.Join(Environment.NewLine, prefixed.ToArray());
}
Как насчет этого.Он использует StringBuilder, если вы планируете добавить много строк.
string MagicFunction(string input)
{
StringBuilder sb = new StringBuilder();
StringReader sr = new StringReader(input);
string line = null;
using(StringReader sr = new StringReader(input))
{
while((line = sr.ReadLine()) != null)
{
sb.Append(String.Concat("-- ", line, System.Environment.NewLine));
}
}
return sb.ToString();
}