C#:う誤動作防止)テキストの各行には、文字列?
-
13-09-2019 - |
質問
う実装のMagicFunction'のように見える以下の(途)試験パス?
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のボックスを転送する場合もあるウィンドウボックスしてください指定の異なるタイプの改行コード.以降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(\ Rの\ n)が改行やUnixのもの(\ n)がどちらかに対処したい場合:
var result = "-- " + str.Replace("\n", "\n-- ");
それは前にあった場所残されるよう、\ rを触れる必要はありません。あなたはUnixとWindowsの間で横断したいしかし、もします:
var result = "-- " + str.Replace("\r","").Replace("\n", Enviornment.NewLine + "-- ");
これを行うと、ローカルOSの形式で結果を返します。
あなたはそのようにそれを行うことができます:
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();
}