繁体   English   中英

字符串中的String.Empty

[英]String.Empty in strings

2天前,有一个与string.LastIndexOf(String.Empty)相关的问题,返回字符串的最后一个索引:

C#字符串是否以空字符串结尾?

所以我想到了; 一个字符串总是可以在字符之间包含string.empty,如:

"testing" == "t" + String.Empty + "e" + String.Empty +"sting" + String.Empty;

在此之后,我想测试String.IndexOf(String.Empty)是否返回0,因为String.Empty可以在字符串中的任何字符之间,这将是我期望它返回的,我没有错。

string testString = "testing";
int index = testString.LastIndexOf(string.Empty); // index is 6
index = testString.IndexOf(string.Empty); // index is 0

它实际上返回0.我开始认为如果我可以用String.Empty拆分一个字符串,我会得到至少2个字符串,那将是String.Empty和字符串的其余部分,因为String.IndexOf(String.Empty)返回0和String.LastIndexOf(String.Empty)返回字符串的长度..这是我编码的:

string emptyString = string.Empty;
char[] emptyStringCharArr = emptyString.ToCharArray();
string myDummyString = "abcdefg";
string[] result = myDummyString.Split(emptyStringCharArr);

这里的问题是,我无法将String.Empty转换为char[]并导致空字符串[]。 我真的很想看到这个操作的结果及其背后的原因。 所以我的问题是:

  1. 有没有办法用String.Empty拆分字符串?

  2. 如果不可能,但在一个绝对的世界中,它是否可能,它会返回一个充满字符的数组,如[0] = "t" [1] = "e" [2] = "s"等等或它只会返回完整的字符串吗? 这会更有意义,为什么?

当你在任何String中查找String.Empty时,你总是得到一个索引为0,因为它是String.IndexOf(String.Empty)的定义你应该看一下MSDN ,它说:

“如果找到该字符串,则从零开始的索引值位置,如果不是,则返回-1。如果值为String.Empty,则返回值为0。”

针对你的第二个问题:

我认为您可以通过在代码中执行以下操作来拆分带有空字符串的字符串:

String test = "fwewfeoj";
test.Split(new String[] { String.Empty }, StringSplitOptions.None);

顺便说一句:可能克隆这个答案为什么“abcd”.StartsWith(“”)返回true?

是的,您可以使用字符串.Empty拆分任何字符串

 string[] strArr = s.Split(string.Empty.ToCharArray());

你真的需要分割字符串,还是只是试图获得所有单个字符?

如果是这样,那么字符串也是IEnumerable<char> ,你也有一个索引器。

那么,你究竟想做什么?

不,你不能用string.Empty或类似的结构调用split方法。

string emptyString = string.Empty;
char[] emptyStringCharArr = emptyString.ToCharArray();

这将为您提供一个空数组的字符。 这是因为String已经是内存中的字符数组,而String.Empty没有值。

要进一步细分,请考虑.ToCharArray()的实现

private Char[] toCharArray(String value)
{
    var stringLength = value.Length;
    var returningArray = new char[stringLength];
    for(var i = 0; i < stringLength; i++)
    {
        returningArray[i] = value[i];
    }
    return returningArray;
}

当然长度为零,您将返回一个空的char数组。 当然这不是确切的实现,但你可以看到它是如何以及为什么没有返回任何东西(因此不会像你期望的那样分裂字符串)

它不是一个包含单个元素String.Empty的数组,因为这没有多大意义。 当您尝试拆分空数组时,它不知道如何拆分或拆分,因此您将返回原始字符串。

至于为什么它默认返回0,考虑:

private int IndexOf(String value, String searchFor)
{
    for(var i = 0; i < value.Length; i++)
    {
        if(value.Substring(i, searchFor.Length) == searchFor)
        {
            return i;
        }
    }
    return -1;
}
private int LastIndexOf(String value, String searchFor)
{
    var searchLength = searchFor.Length;
    for(var i = value.Length - searchFor.Length; i >= 0; i--)
    {
        if(value.Substring(i, searchLength) == searchFor)
            return i;
    }
    return -1;
}

String.SubString(x,0)将始终返回String.Empty,无论传入什么(甚至是String.Empty)。 因此,添加检查并返回0会更快(因为即使它运行循环也是如此)。

由于String.Empty只是一个空字符串,所以如果你这样做:

var s = "part1" + string.Empty + "part2";

这将导致完全相同的字符串:

var s = "part1" + "part2";

第一种语法不会在两个部分之间插入魔术空字符串。

根据定义,IndexOf返回0,不是因为字符之间有一些魔术空字符串。

我想不出用空字符串分割字符串的逻辑方法。 应该归还什么? 当使用空字符串作为string.Split方法的参数时,它将被忽略。 如果它是唯一使用的分隔符,则将返回未分割的字符串。

你也可以说

"testing" == string.Empty + string.Empty + string.Empty + ... + "t" +  string.Empty + string.empty + "esting";

所以实际上你可以在每个字符之间放置一个无穷无尽的string.empty数组。

所以我认为1不可能2没有,它只是没有意义......

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM