[英]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!
因此,當字符串被拆分,
以及!
結果是Hello
, this
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.