在c#中将字符串转换为字符串数组
Posted
技术标签:
【中文标题】在c#中将字符串转换为字符串数组【英文标题】:Convert a string to an array of strings in c# 【发布时间】:2021-05-09 15:39:49 【问题描述】:我能否仅使用 linq 获得包含 CRLF 或 LF 或 CR 的字符串数组?
我不想使用循环。
我有一个这样的字符串"Hello \r\n Stackverflow\n How are you doing \r"
,我必须把它转换成这样
mystring[0] = "Hello \r\n"
mystring[1] = "Stackverflow\n"
mystring[2] = "How are you doing \r"
有什么想法吗?
【问题讨论】:
Regex.Split
在这里可能是最简单的——string.Split
将删除换行符
@canton7 请教我怎么做
“我不想要”通常是做某事的一个非常糟糕的理由。除了这个 LINQ 是在引擎盖下循环。
@HimBromBeere 但在聚合中使用不可变数据进行此类操作通常很有趣......(需要记住“\r\n”与“\r”区别的前一个字符肯定调用有趣的代码)。
Regex.Split(s, @"(?<=\r\n)|(?<=\n)|(?<=\r)")
almost gets you there,但由于我不明白的原因,它将\r\n
分成两行
【参考方案1】:
由于我们必须处理“\r”、“\n”和“\r\n”这一事实,这有点复杂。我假设你不需要处理 "\n\r" - 如果你这样做,你必须在下面的代码中为它添加一个案例。
显然有很多方法可以解决这个问题;这是一种低级方法,除了基本循环之外不使用任何东西:
public static IEnumerable<string> SplitByAndKeepLineSeparators(string input)
if (input.Length == 0)
yield break;
int i = 0, j = 0;
while (true)
if (i == input.Length - 1) // Last char?
yield return input.Substring(j, i - j + 1);
break;
switch (input[i])
case '\r' when input[i+1] == '\n':
yield return input.Substring(j, i - j + 2);
i += 2;
j = i;
break;
case '\r':
yield return input.Substring(j, i - j + 1);
j = ++i;
break;
case '\n':
yield return input.Substring(j, i - j + 1);
j = ++i;
break;
default:
++i;
break;
注意:如果使用旧版本的 C#,您将无法使用那种 switch
,因此您的代码必须是:
public static IEnumerable<string> SplitByAndKeepLineSeparators(string input)
if (input.Length == 0)
yield break;
int i = 0, j = 0;
while (true)
if (i == input.Length - 1) // Last char?
yield return input.Substring(j, i - j + 1);
break;
if (input[i] == '\r' && input[i + 1] == '\n')
yield return input.Substring(j, i - j + 2);
i += 2;
j = i;
else if (input[i] == '\r')
yield return input.Substring(j, i - j + 1);
j = ++i;
else if (input[i] == '\n')
yield return input.Substring(j, i - j + 1);
j = ++i;
else
++i;
【讨论】:
【参考方案2】:请尝试以下行:-
var arr = mystring.Split('\n');
【讨论】:
\r 呢? 我得不到我需要的东西 Split可以接受param数组,可以在split函数中传递多个逗号分隔的字符。 Split() 在返回的字符串中不包含分隔符。以上是关于在c#中将字符串转换为字符串数组的主要内容,如果未能解决你的问题,请参考以下文章