簡體   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