字符串中的String.Empty

时间:2011-01-12 08:43:15

标签: c# string split string-comparison

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

Do C# strings end with empty string?

所以我想到了;一个字符串总是可以在字符之间包含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) 1}}返回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. 如果不可能,但是在一个绝对的世界中,它是否可能,它会返回一个充满chars的数组,如[0] = "t" [1] = "e" [2] = "s"等等,还是只返回完整的字符串?哪个会更有意义,为什么?

6 个答案:

答案 0 :(得分:2)

当您在任何字符串中查找String.Empty时,您将始终获得索引0,因为它是String.IndexOf(String.Empty)的定义,您应该查看MSDN,其中显示:< / p>

  

“从零开始的指数位置   找到该字符串时的值,或-1   如果不是。如果价值是   String.Empty,返回值为0.“

针对你的第二个问题:

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

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

顺便说一句:可能克隆这个答案  Why does "abcd".StartsWith("") return true?

答案 1 :(得分:2)

是的,您可以使用字符串.Empty

拆分任何字符串
 string[] strArr = s.Split(string.Empty.ToCharArray());

答案 2 :(得分:1)

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

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

那么,你究竟想做什么?

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

答案 3 :(得分:1)

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会更快(因为即使它运行循环也是如此)。

答案 4 :(得分:0)

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

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

这将产生与以下字符串完全相同的字符串:

var s = "part1" + "part2";

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

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

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

答案 5 :(得分:0)

你也可以说

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

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

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