题
什么会的“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作为扩展方法。它利用托马斯·莱维斯克的答案,但得到增强,可处理所有主要的环境,并假定您想要的输出字符串中使用的输入字符串的同一行终结符。
我赞成托马斯·莱维斯克的答案(超过斯宾塞Ruport的,弗雷德里克莫克的,拉撒路和JDunkerley),因为它是表现最好的。我会在我的博客和链接岗位绩效结果后来在这里为那些有兴趣。
(显然, '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;
}
修改强>结果 正如其他人所指出的那样,换行符环境之间有所不同。如果你只打算使用此功能,在相同的环境中创建的文件,那么统环境将正常工作。不过,如果你在Linux机器上创建一个文件,然后在将其传送到Windows中你要指定一个不同类型的换行符。因为Linux使用\ n和Windows使用\ r \ n这段代码将适用于Windows和Linux的文件都正常工作。如果你把自己的Mac电脑到混合(\ r)的,你必须拿出一些更复杂。
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(\ r \ n)的新行或Unix的人(\ n)的,则:
var result = "-- " + str.Replace("\n", "\n-- ");
无需触摸\ r,因为它是被离开丢失之前。然而,如果你想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();
}
不隶属于 StackOverflow