Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 字符串。字符串中为空_C#_String_Split_String Comparison - Fatal编程技术网

C# 字符串。字符串中为空

C# 字符串。字符串中为空,c#,string,split,string-comparison,C#,String,Split,String Comparison,2天前,有一个问题与string.LastIndexOf(string.Empty)返回字符串的最后一个索引有关: 所以我想,;字符串始终可以在以下字符之间包含string.empty: "testing" == "t" + String.Empty + "e" + String.Empty +"sting" + String.Empty; 在此之后,我想测试String.IndexOf(String.Empty)是否返回0,因为String.Empty可以介于字符串中的任何字符之间,这就是

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

所以我想,;字符串始终可以在以下字符之间包含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
拆分一个字符串,我会得到至少两个字符串,它们是
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[]
并生成空字符串[]。我真的很想看到这次行动的结果和背后的原因。因此,我的问题是:

  • 有没有办法将字符串拆分为
    string.Empty

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


  • 在任何字符串中查找String.Empty时,都会得到0的索引,因为它是
    String.IndexOf(String.Empty)
    的定义。您应该查看,其中显示:

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

    针对你的第二个问题:

    我认为可以通过在代码中执行以下操作将字符串拆分为空字符串:

    String test = "fwewfeoj";
    test.Split(new String[] { String.Empty }, StringSplitOptions.None);
    
    顺便说一下:这个答案可能是克隆的

    您真的需要拆分字符串,还是只想获取所有单个字符

    如果是这样,那么字符串也是
    IEnumerable
    ,并且您还有一个索引器

    那么,你到底想做什么


    不,您不能使用string.Empty或类似的构造调用split方法。

    因为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无,只是没有意义…

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

     string[] strArr = s.Split(string.Empty.ToCharArray());
    
    这将为您提供一个空字符数组。 这是因为String已经是内存中的字符数组,String.Empty没有值

    进一步分解它,考虑ToCARARRAY()< /P>的实现。

    private Char[]tocharray(字符串值)
    {
    var stringLength=value.Length;
    var returningArray=新字符[stringLength];
    对于(变量i=0;i
    当然,长度将为零,您将返回一个空字符数组。当然,这不是确切的实现,但是您可以看到它如何以及为什么不返回任何内容(因此不会像您期望的那样在字符串上拆分)

    它不是一个包含单个元素字符串的数组。空,因为这没有真正意义。当您尝试在空数组上拆分时,它不知道如何或在什么上拆分,因此会返回原始字符串

    至于它默认返回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;
    }
    
    private int IndexOf(字符串值,字符串搜索)
    {
    对于(变量i=0;i=0;i--)
    {
    if(value.Substring(i,searchLength)==searchFor)
    返回i;
    }
    返回-1;
    }
    

    子字符串(x,0)将始终返回String.Empty,而不管传入的是什么(甚至是String.Empty)。出于这个原因,无论是否运行循环,添加检查并返回0都要快得多。

    你说的是显而易见的,我可以看到,对于IndexOf(string.empty),我总是会得到0,但我正在寻找背后的原因,并尽我所能找到它。因为它是在IndexOf(string.empty)函数中定义的总是要返回0。他给了你原因。当String.Empty作为特例返回传入时,它返回0。我仍然不明白为什么。一定有原因。因为“ab”==“a”+字符串.empty+“b”,我希望“ab”.split(string.empty)返回“a”和“b”,如果我能得到“ab”中string.empty的所有索引,我希望它是0,1。因此MSDN声明indexof(string.empty)将返回0,lastIndex(string.empty)将返回字符串的最后一个索引。这是否意味着他们真的要检查传入参数是否为string.empty并从那里返回,或者后面是否有任何逻辑?但是,“ab”+string.empty+“c”,然后将其拆分,如果可以的话,您将无法返回这两个部分,您将得到3个部分。Empty等同于一个空字符串,因此它的名称是空的,在将它添加到
    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;
    }
    
    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;
    }