簡體   English   中英

String.Empty在字符串末尾的“為什么”

[英]The “Why” Behind String.Empty at the End of a String

背景

我正在使用帶分隔符的字符串,並使用String.Split將每個子字符串放入數組中,因為我注意到數組中的最后一個點是"" 因為我要在數組的最后一個索引中查找特定的子字符串,所以最終結果不正確,我最終遇到了這篇文章,解釋了所有以string.Empty結尾的字符串。

下面顯示了這種行為。 當我分割句子並將每個子字符串寫入控制台時,我們可以看到最后一個元素是空字符串:

public class Program
{
    static void Main(string[] args)
    {
        const string mySentence = "Hello,this,is,my,string!";
        var wordArray = mySentence.Split(new[] {",", "!"}, StringSplitOptions.None);

        foreach (var word in wordArray)
        {
            var message = word;
            if (word == string.Empty) message = "Empty string";
            Console.WriteLine(message);
        }         

        Console.ReadKey();
    }
}

問題和“修復”

從概念上講,每個字符之間都有空字符串,但是為什么即使在字符串末尾, String行為也是如此? 似乎令人困惑的是, "ABC"等效於"ABC" + ""ABC + "" + "" + ""那么為什么不按字面意義僅將字符串視為"ABC"呢? 周圍有一個“修復”以獲取我想要的“ true”子字符串:

public class Program
{
    static void Main(string[] args)
    {
        const string mySentence = "Hello,this,is,my,string!";
        var wordArray = mySentence.Split(new[] {",", "!"}, StringSplitOptions.None);

        var wordList = new List<string>();
        wordList.AddRange(wordArray);
        wordList.RemoveAt(wordList.LastIndexOf(string.Empty));

        foreach (var word in wordList)
        {
            var message = word;
            if (word == string.Empty) message = "Empty string";
            Console.WriteLine(message);
        }

        Console.ReadKey();
    }
}

但是我仍然不明白為什么字符串的末尾會具有相同的行為,因為后面沒有另一個字符需要空字符串。 它對編譯器有用嗎?

發生這種情況是因為您正在使用StringSplitOptions.None而分隔符值之一出現在字符串的末尾。 該選項的全部目的是創建您要觀察的行為:它將包含N個定界符的字符串拆分為正好N +1個片段。

要查看所需的行為,請使用StringSplitOptions.RemoveEmptyEntries

var wordArray = mySentence.Split(new[] {",", "!"}, StringSplitOptions.RemoveEmptyEntries);

至於為什么你看到自己所看到的。 行為StringSplitOptions.None是查找輸入字符串中定界符的所有位置,並返回定界符前后每個片段的數組。 舉例來說,如果您要解析一個已知有正好N個部分的字符串,但是其中某些部分可能為空白,這可能會很有用。 因此,例如,在逗號分隔符上分割以下內容,它們每個都將產生3個部分:

a,b,c
a,b,
a,,c
a,,
,b,c
,b,
,,c
,,

如果要允許定界符之間而不是在開頭或結尾使用空值,則可以在分割之前在字符串的開頭或結尾剝離定界符:

var wordArray = Regex
    .Replace(mySentence, "^[,!]|[,!]$", "")
    .Split(new[] {",", "!"}, StringSplitOptions.None);

空字符串是字符串的0 到處都有字面的無限。

很自然地, “ ABC”等效於“ ABC” +“”或ABC +“” +“” +“” 就像3等於3 + 0或3 + 0 + 0 + 0一樣自然。

而且您在“ Hello,this,is,my,string!”。Split('!')“之后有一個空字符串的事實確實意味着某些事情,這意味着您的字符串以”!“結尾

""Hello,this,is,my,string!每個字母之間的間隔Hello,this,is,my,string! 因此,當字符串被拆分,以及! 結果是Hellothis is my string "" ""是字符串末尾與!之間的空字符!

如果將""替換為可見字符(例如# ),則您的字符串看起來像是#H#e#l#l#o#,#t#h#i#s#,#i#s#,#m#y#,#s#t#r#i#n#g#!#

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM