通过 ClientAPI.COLUMN_DELIMITER 连接字符串,然后通过相同的分隔符拆分添加两个新元素
Joining strings by ClientAPI.COLUMN_DELIMITER and then splitting by the same delimiter adds two new elements
我有以下
string.Join(ClientAPI.COLUMN_DELIMITER),(new string[] {"1", "2" })).Split(ClientAPI.COLUMN_DELIMITER.ToCharArray())
我希望结果是一个长度为 2 的数组,而不是添加了两个新的空字符串。
为什么会发生这种情况,如何在 Join 方法中避免这种情况。 (我无法控制 Split)。
编辑
只需使用StringSplitOptions.RemoveEmptyEntries
string.Join(new string(ClientAPI.COLUMN_DELIMITER.ToCharArray()), (new string[] { "1", "2" }))
.Split(ClientAPI.COLUMN_DELIMITER.ToCharArray(), StringSplitOptions.RemoveEmptyEntries)
编辑
无法return原始空字符串。因为,你不知道哪个是原创的。也许您可以在用 "pattern" 拆分之前替换空字符串,然后在恢复它们时用空字符串替换回去。
string pattern = "emptystringpattern";
string seperator = "||";
string[] input = new string[] { string.Empty,"1" };
for (int i = 0; i < input.Length; i++)
{
if (input[i] == string.Empty)
{
input[i] = pattern;
}
}
string joinedInput = string.Join(seperator, input);
var splits = joinedInput.Split(seperator.ToCharArray(),StringSplitOptions.RemoveEmptyEntries);
for (int i = 0; i < splits.Length; i++)
{
if (splits[i] == pattern)
{
splits[i] = string.Empty;
}
}
此外,pattern
不应包含分隔符。
另一种选择是,您可以在拆分之前和拆分过程中获取空字符串的计数,您可以根据计数将它们重新添加到数组中。
Why does this happen [..] ?
String.Split Method (Char[]) 的文档告诉我们:
Each element of separator defines a separate delimiter character. If two delimiters are adjacent, or a delimiter is found at the beginning or end of this instance, the corresponding element in the returned array contains Empty
这就是为什么你的结果数组中有空字符串(不是因为你在评论中写的 Join 方法)。
编辑:
在此示例中,Split 方法返回您的 "input" 数组:
string.Join("~|~", new string[] { string.Empty, "2" }).Split(new string[] { "~|~" }, StringSplitOptions.None)
编辑-2:
试试这个:
string.Join(ClientAPI.COLUMN_DELIMITER, new string[] { string.Empty, "2" }).Split(ClientAPI.COLUMN_DELIMITER, StringSplitOptions.None);
您的代码存在的问题是您为 String.Split
方法提供了一个字符数组。现在它认为您想将原始字符串分成任何给定字符,在您的情况下为“~”和“|”。
你的测试字符串是“~|~1”,所以他找到了三个分隔符:'~', '|'又是'~'。结果,三个定界符表示四个字符串,因此您的三个空字符串。
你真正想要做的是用“~|~”分割成一个完整的字符串,你可以通过调用来完成:
joined_input.Split(new string[] { ClientAPI.COLUMN_DELIMITER }, StringSplitOptions.None)
(没有 .ToCharArray)
如果您不想收到空条目,您也可以使用StringSplitOptions.RemoveEmptyEntries
。
我有以下
string.Join(ClientAPI.COLUMN_DELIMITER),(new string[] {"1", "2" })).Split(ClientAPI.COLUMN_DELIMITER.ToCharArray())
我希望结果是一个长度为 2 的数组,而不是添加了两个新的空字符串。
为什么会发生这种情况,如何在 Join 方法中避免这种情况。 (我无法控制 Split)。
编辑
只需使用StringSplitOptions.RemoveEmptyEntries
string.Join(new string(ClientAPI.COLUMN_DELIMITER.ToCharArray()), (new string[] { "1", "2" }))
.Split(ClientAPI.COLUMN_DELIMITER.ToCharArray(), StringSplitOptions.RemoveEmptyEntries)
编辑
无法return原始空字符串。因为,你不知道哪个是原创的。也许您可以在用 "pattern" 拆分之前替换空字符串,然后在恢复它们时用空字符串替换回去。
string pattern = "emptystringpattern";
string seperator = "||";
string[] input = new string[] { string.Empty,"1" };
for (int i = 0; i < input.Length; i++)
{
if (input[i] == string.Empty)
{
input[i] = pattern;
}
}
string joinedInput = string.Join(seperator, input);
var splits = joinedInput.Split(seperator.ToCharArray(),StringSplitOptions.RemoveEmptyEntries);
for (int i = 0; i < splits.Length; i++)
{
if (splits[i] == pattern)
{
splits[i] = string.Empty;
}
}
此外,pattern
不应包含分隔符。
另一种选择是,您可以在拆分之前和拆分过程中获取空字符串的计数,您可以根据计数将它们重新添加到数组中。
Why does this happen [..] ?
String.Split Method (Char[]) 的文档告诉我们:
Each element of separator defines a separate delimiter character. If two delimiters are adjacent, or a delimiter is found at the beginning or end of this instance, the corresponding element in the returned array contains Empty
这就是为什么你的结果数组中有空字符串(不是因为你在评论中写的 Join 方法)。
编辑: 在此示例中,Split 方法返回您的 "input" 数组:
string.Join("~|~", new string[] { string.Empty, "2" }).Split(new string[] { "~|~" }, StringSplitOptions.None)
编辑-2: 试试这个:
string.Join(ClientAPI.COLUMN_DELIMITER, new string[] { string.Empty, "2" }).Split(ClientAPI.COLUMN_DELIMITER, StringSplitOptions.None);
您的代码存在的问题是您为 String.Split
方法提供了一个字符数组。现在它认为您想将原始字符串分成任何给定字符,在您的情况下为“~”和“|”。
你的测试字符串是“~|~1”,所以他找到了三个分隔符:'~', '|'又是'~'。结果,三个定界符表示四个字符串,因此您的三个空字符串。
你真正想要做的是用“~|~”分割成一个完整的字符串,你可以通过调用来完成:
joined_input.Split(new string[] { ClientAPI.COLUMN_DELIMITER }, StringSplitOptions.None)
(没有 .ToCharArray)
如果您不想收到空条目,您也可以使用StringSplitOptions.RemoveEmptyEntries
。