C# 通过ClientAPI.COLUMN_分隔符连接字符串,然后通过同一分隔符拆分,将添加两个新元素

C# 通过ClientAPI.COLUMN_分隔符连接字符串,然后通过同一分隔符拆分,将添加两个新元素,c#,string,dotnetnuke,C#,String,Dotnetnuke,我有以下几点 string.Join(ClientAPI.COLUMN_分隔符),(新字符串[]{“1”,“2”})).Split(ClientAPI.COLUMN_分隔符.tocharray()) 我希望结果是长度为2的数组,而不是添加两个新的空字符串 为什么会发生这种情况,以及如何在Join方法中避免这种情况。(我无法控制拆分) 编辑 只需使用StringSplitOptions。删除mptyentries string.Join(new string(ClientAPI.COLUMN_D

我有以下几点

string.Join(ClientAPI.COLUMN_分隔符),(新字符串[]{“1”,“2”})).Split(ClientAPI.COLUMN_分隔符.tocharray())

我希望结果是长度为2的数组,而不是添加两个新的空字符串

为什么会发生这种情况,以及如何在Join方法中避免这种情况。(我无法控制拆分)

编辑


只需使用
StringSplitOptions。删除mptyentries

string.Join(new string(ClientAPI.COLUMN_DELIMITER.ToCharArray()), (new string[] { "1", "2" }))
.Split(ClientAPI.COLUMN_DELIMITER.ToCharArray(), StringSplitOptions.RemoveEmptyEntries)
编辑

无法返回原始空字符串。因为,你不知道哪一个是原创的。也许您可以在使用“模式”拆分之前替换空字符串,然后在恢复它们时用空字符串替换回来

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;
    }
}
stringpattern=“emptystringpattern”;
字符串分隔符=“||””;
字符串[]输入=新字符串[]{string.Empty,“1”};
for(int i=0;i
另外,
模式
不应包含delimeter字符

另一个选项是,您可以在拆分之前获得空字符串的计数,在拆分过程之后,您可以根据计数再次将它们添加到数组中

为什么会发生这种情况

有关的文档请告诉我们:

分隔符的每个元素定义一个单独的分隔符字符。如果两个分隔符相邻,或者在此实例的开头或结尾处找到一个分隔符,则返回数组中的相应元素包含空值

这就是为什么结果数组中有空字符串(不是因为您在注释中编写的Join方法)

编辑: 在本例中,Split方法返回“输入”数组:

编辑-2: 试试这个:

string.Join(ClientAPI.COLUMN_DELIMITER, new string[] { string.Empty, "2" }).Split(ClientAPI.COLUMN_DELIMITER, StringSplitOptions.None);

代码的问题在于,您正在为
String.Split
方法提供一个字符数组。现在,它认为您希望在给定的任何字符处分割原始字符串,在您的情况下是“~”和“|”

您的测试字符串是“~| ~1”,因此他又找到了三个分隔符:“~”、“|”和“~”。三个分隔符意味着结果是四个字符串,因此是三个空字符串

您真正想要做的是将“~| ~”拆分为一个完整的字符串,您可以通过调用:

joined\u input.Split(新字符串[]{ClientAPI.COLUMN\u DELIMITER},StringSplitOptions.None)

(不含托卡雷)


如果您不想接收空条目,也可以使用
StringSplitOptions.removeMptyEntries

进行拆分,我不知道这是什么意思。为什么不把它拆分成更可读的行,自己调试呢?一步一步地检查不同的值。您能为分隔符和输入字符串发布潜在(典型)值吗?另外,将语句拆分为单独的行以避免愚蠢的事情,例如
新建字符串(ClientAPI.COLUMN\u DELIMITER.ToCharArray())
,这看起来像是将字符串转换为字符数组,然后再转换回字符串。如果这确实是你正在做的事情,那就浪费了精力——信息太少,代码太复杂,很难判断。但是,在猜测时,如果没有输入值进行计算,它只能是猜测——通过一个字符串(可能不止一个字符)连接,它将在每个元素之间添加所有分隔符。然后,拆分将在每个分隔符上拆分,从而在分隔符之间生成空元素。请确保仅在单个分隔符上联接。拆分时为什么要调用ToCharray?只需执行
input.Split(new[]{separator})
我不能删除空条目,我只需要删除通过“Join”方法添加的条目。如果输入数组是
newstring[]{string.Empty,“2”}
为什么“Join”添加空字符串,我不理解。请分享实际输出和预期输出。我更新了问题。预期的输出显然是输入数组。是否有解决方法?我必须保持分隔符不变。@user7518s我编辑了我的答案。我希望它能帮助您。我得到的结果与添加
StringSplitOptions.None
之前相同。
string.Join(ClientAPI.COLUMN_DELIMITER, new string[] { string.Empty, "2" }).Split(ClientAPI.COLUMN_DELIMITER, StringSplitOptions.None);