通过 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