C# 如何进行嵌套字符串拆分?

C# 如何进行嵌套字符串拆分?,c#,string,C#,String,我有一个起初看似微不足道的问题,但后来变成了我不知道如何轻松解决的问题。我需要能够以字符串形式存储项目列表。然后,这些项目可以是列表、或其他可能包含分隔符的值。我有两种不同的方法来解压这两种不同的情况,但我意识到我需要从string.Split使用的任何分隔符中编码包含的值 为了说明这个问题: 这将产生一个列表“mary;john;carl;dog;cat;fish;plainValue”,我无法拆分这个值来获取三个原始嵌套字符串。事实上,我在split上得到的不是三个原始字符串,而是7个字符串

我有一个起初看似微不足道的问题,但后来变成了我不知道如何轻松解决的问题。我需要能够以字符串形式存储项目列表。然后,这些项目可以是列表、或其他可能包含分隔符的值。我有两种不同的方法来解压这两种不同的情况,但我意识到我需要从string.Split使用的任何分隔符中编码包含的值

为了说明这个问题:

这将产生一个列表“mary;john;carl;dog;cat;fish;plainValue”,我无法拆分这个值来获取三个原始嵌套字符串。事实上,我在split上得到的不是三个原始字符串,而是7个字符串,因此这种方法根本不起作用

我想要的是允许对字符串中的值进行编码,这样我就可以按照打包/加入内容之前的方式解包/拆分内容我想我可能需要离开string.Split和string.Join,这很好。我可能只是忽略了一些有用的类或方法。

  • 如何允许将任何字符串值打包/解包到列表中?
    如果可能的话,我更喜欢简洁的解决方案,而不是笨重的解决方案


对于好奇的人来说,我正在Unity3D中为PlayerPrefs做扩展,我只能处理int、float和string。因此,我选择字符串作为数据载体。这就是我制作这个嵌套字符串列表的原因。

预期的项目是7,因为您正在使用
进行拆分字符。我建议将您的代码更改为:

string[] nested = { "mary;john;carl", "dog;cat;fish", "plainValue" }
string list = string.Join("@" nested);
string[] unnested = list.Split('@'); // 3 strings again

预期项目为7,因为您正在使用
进行拆分字符。我建议将您的代码更改为:

string[] nested = { "mary;john;carl", "dog;cat;fish", "plainValue" }
string list = string.Join("@" nested);
string[] unnested = list.Split('@'); // 3 strings again

使用分号
(;)
以外的其他值进行连接。例如,您可以使用逗号
(,)
,您将得到
“mary;john;carl,dog;cat;fish,plainValue”
。当您再次基于
(,)
作为分隔符拆分它时,您应该返回原始字符串值。

使用分号
(;)
以外的其他值进行合并。例如,您可以使用逗号
(,)
,您将得到
“mary;john;carl,dog;cat;fish,plainValue”
。当您再次基于
(,)
作为分隔符拆分它时,您应该返回原始字符串值。

您是否考虑过使用其他分隔符,例如“|”


这样,连接的字符串将是“mary;john;carl | dog;cat;fish | plainValue”,当您调用list.split(“|”)时;它将返回三个原始字符串

您是否考虑使用不同的分隔符,例如“|”

这样,连接的字符串将是“mary;john;carl | dog;cat;fish | plainValue”,当您调用list.split(“|”)时;它将返回三个原始字符串,请尝试:

const char joinChar = '╗'; // make char const
string[] nested = { "mary;john;carl", "dog;cat;fish", "plainValue" };
string list = string.Join(Convert.ToString(joinChar), nested);
string[] unnested = list.Split(joinChar); // eureka returns 3!
在正常的“集合”之外使用ascii字符可以让您加入和拆分,而不会破坏
上分离的逻辑字符。

尝试:

const char joinChar = '╗'; // make char const
string[] nested = { "mary;john;carl", "dog;cat;fish", "plainValue" };
string list = string.Join(Convert.ToString(joinChar), nested);
string[] unnested = list.Split(joinChar); // eureka returns 3!

在正常的“集合”之外使用ascii字符可以让您加入和拆分,而不会破坏
上分离的逻辑
char。

在加入之前用base64编码您的字符串。

在加入之前用base64编码您的字符串。

我也想出了自己的解决方案

我可以对项目的长度进行编码,然后是项目的内容。它根本不会使用string.Split和string.Join,但它会解决我的问题。内容将保持不变,任何需要编码的内容都可以在其内容空间中使用这种编码

要说明格式(恒定长度标题),请执行以下操作:

要说明格式(可变长度标题),请执行以下操作:

在前者中,使用固定长度的字符来描述内容的长度。这可以是纯文本、十六进制、base64或其他编码

具有4个十六进制(ffff/65535最大长度)的示例:

0005你好0005世界

在后一个示例中,我们可以将其简化为:

5:你好5:世界

然后我可以查找第一个出现的
,并首先解析长度,以提取后面的子字符串。之后是列表的下一项

嵌套示例可能如下所示:

e:5:Hello5:Worlda:2:Hi4:John

  • (列表-14个字符,包括标题)
    • 你好(5个字符)
    • 世界(5个字符)
  • (列表-包括标题在内的10个字符)
    • 嗨(2个字符)
    • 约翰(4个字符)

缺点是它明确要求所有项目的长度,即使没有“共享分隔符”字符(如果使用固定长度标题,此解决方案不使用分隔符)。

我也提出了自己的解决方案

我可以对项目的长度进行编码,然后是项目的内容。它根本不会使用string.Split和string.Join,但它会解决我的问题。内容将保持不变,任何需要编码的内容都可以在其内容空间中使用这种编码

要说明格式(恒定长度标题),请执行以下操作:

要说明格式(可变长度标题),请执行以下操作:

在前者中,使用固定长度的字符来描述内容的长度。这可以是纯文本、十六进制、base64或其他编码

具有4个十六进制(ffff/65535最大长度)的示例:

0005你好0005世界

在后一个示例中,我们可以将其简化为:

5:你好5:世界

然后我可以查找第一个出现的
,并首先解析长度,以提取后面的子字符串。之后是列表的下一项

可以使用嵌套示例