Kon*_*rin 131 c# string syntax multiline
如何将多行字符串拆分成行?
我知道这种方式
var result = input.Split("\n\r".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
Run Code Online (Sandbox Code Playgroud)
看起来有点难看,失去空行.有更好的解决方案吗?
Kon*_*lph 161
如果它看起来很难看,只需删除不必要的ToCharArray
电话.
如果你想要么拆分\n
或者\r
,你有两个选择:
使用数组文字 - 但这将为您提供Windows样式行结尾的空行\r\n
:
var result = text.Split(new [] { '\r', '\n' });
Run Code Online (Sandbox Code Playgroud)使用正则表达式,如Bart所示:
var result = Regex.Split(text, "\r\n|\r|\n");
Run Code Online (Sandbox Code Playgroud)如果你想保留空行,为什么要明确告诉C#扔掉它们?(StringSplitOptions
参数) - StringSplitOptions.None
改用.
Jac*_*ack 117
using (StringReader sr = new StringReader(text)) {
string line;
while ((line = sr.ReadLine()) != null) {
// do something
}
}
Run Code Online (Sandbox Code Playgroud)
ora*_*rad 41
这很好,比Regex更快:
input.Split(new[] {"\r\n", "\r", "\n"}, StringSplitOptions.None)
Run Code Online (Sandbox Code Playgroud)
重要的是"\r\n"
在数组中首先使它成为一个换行符.以上结果与这些Regex解决方案的结果相同:
Regex.Split(input, "\r\n|\r|\n")
Regex.Split(input, "\r?\n|\r")
Run Code Online (Sandbox Code Playgroud)
除了Regex的速度慢了大约10倍.这是我的测试:
Action<Action> measure = (Action func) => {
var start = DateTime.Now;
for (int i = 0; i < 100000; i++) {
func();
}
var duration = DateTime.Now - start;
Console.WriteLine(duration);
};
var input = "";
for (int i = 0; i < 100; i++)
{
input += "1 \r2\r\n3\n4\n\r5 \r\n\r\n 6\r7\r 8\r\n";
}
measure(() =>
input.Split(new[] {"\r\n", "\r", "\n"}, StringSplitOptions.None)
);
measure(() =>
Regex.Split(input, "\r\n|\r|\n")
);
measure(() =>
Regex.Split(input, "\r?\n|\r")
);
Run Code Online (Sandbox Code Playgroud)
输出:
00:00:03.8527616
00:00:31.8017726
00:00:32.5557128
这是扩展方法:
public static class StringExtensionMethods
{
public static IEnumerable<string> GetLines(this string str, bool removeEmptyLines = false)
{
return str.Split(new[] { "\r\n", "\r", "\n" },
removeEmptyLines ? StringSplitOptions.RemoveEmptyEntries : StringSplitOptions.None);
}
}
Run Code Online (Sandbox Code Playgroud)
用法:
input.GetLines() // keeps empty lines
input.GetLines(true) // removes empty lines
Run Code Online (Sandbox Code Playgroud)
Bar*_*ers 36
你可以使用Regex.Split:
string[] tokens = Regex.Split(input, @"\r?\n|\r");
Run Code Online (Sandbox Code Playgroud)
编辑:添加|\r
到(较旧的)Mac线路终结器的帐户.
如果要保留空行,只需删除StringSplitOptions即可.
var result = input.Split(System.Environment.NewLine.ToCharArray());
Run Code Online (Sandbox Code Playgroud)
小智 6
string[] lines = input.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
Run Code Online (Sandbox Code Playgroud)
我有另一个答案,但基于 Jack 的答案,这个答案明显更快,可能更受欢迎,因为它异步工作,尽管速度稍慢。
public static class StringExtensionMethods
{
public static IEnumerable<string> GetLines(this string str, bool removeEmptyLines = false)
{
using (var sr = new StringReader(str))
{
string line;
while ((line = sr.ReadLine()) != null)
{
if (removeEmptyLines && String.IsNullOrWhiteSpace(line))
{
continue;
}
yield return line;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
用法:
input.GetLines() // keeps empty lines
input.GetLines(true) // removes empty lines
Run Code Online (Sandbox Code Playgroud)
测试:
Action<Action> measure = (Action func) =>
{
var start = DateTime.Now;
for (int i = 0; i < 100000; i++)
{
func();
}
var duration = DateTime.Now - start;
Console.WriteLine(duration);
};
var input = "";
for (int i = 0; i < 100; i++)
{
input += "1 \r2\r\n3\n4\n\r5 \r\n\r\n 6\r7\r 8\r\n";
}
measure(() =>
input.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None)
);
measure(() =>
input.GetLines()
);
measure(() =>
input.GetLines().ToList()
);
Run Code Online (Sandbox Code Playgroud)
输出:
00:00:03.9603894
00:00:00.0029996
00:00:04.8221971