C# 如何进行嵌套字符串拆分?
我有一个起初看似微不足道的问题,但后来变成了我不知道如何轻松解决的问题。我需要能够以字符串形式存储项目列表。然后,这些项目可以是列表、或其他可能包含分隔符的值。我有两种不同的方法来解压这两种不同的情况,但我意识到我需要从string.Split使用的任何分隔符中编码包含的值 为了说明这个问题: 这将产生一个列表“mary;john;carl;dog;cat;fish;plainValue”,我无法拆分这个值来获取三个原始嵌套字符串。事实上,我在split上得到的不是三个原始字符串,而是7个字符串,因此这种方法根本不起作用 我想要的是允许对字符串中的值进行编码,这样我就可以按照打包/加入内容之前的方式解包/拆分内容我想我可能需要离开string.Split和string.Join,这很好。我可能只是忽略了一些有用的类或方法。C# 如何进行嵌套字符串拆分?,c#,string,C#,String,我有一个起初看似微不足道的问题,但后来变成了我不知道如何轻松解决的问题。我需要能够以字符串形式存储项目列表。然后,这些项目可以是列表、或其他可能包含分隔符的值。我有两种不同的方法来解压这两种不同的情况,但我意识到我需要从string.Split使用的任何分隔符中编码包含的值 为了说明这个问题: 这将产生一个列表“mary;john;carl;dog;cat;fish;plainValue”,我无法拆分这个值来获取三个原始嵌套字符串。事实上,我在split上得到的不是三个原始字符串,而是7个字符串
- 如何允许将任何字符串值打包/解包到列表中?
如果可能的话,我更喜欢简洁的解决方案,而不是笨重的解决方案
对于好奇的人来说,我正在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:世界
然后我可以查找第一个出现的:
,并首先解析长度,以提取后面的子字符串。之后是列表的下一项
可以使用嵌套示例