在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#中将字符串转换为字符串数组的主要内容,如果未能解决你的问题,请参考以下文章

在c#中将字符串转换为字节数组

如何在c#中将ArrayList转换为字符串数组(字符串[])

在C#中将Char数组转换为字符串[重复]

在c#中将字符串转换为字符串数组

在 C# 中将字符串拆分为字符串数组列表

在java中将字符串数组元素转换为字节数组[重复]