[英]Convert array of objects with string property to an array of strings in c#
[英]Convert a string to an array of strings in c#
我能否仅使用 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"
有任何想法吗?
由于我们必须处理“\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;
}
}
}
请尝试以下行:-
var arr = mystring.Split('\n');
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.