C# ";为什么;在字符串后面。字符串末尾为空 出身背景
当我注意到数组中的最后一个点是C# ";为什么;在字符串后面。字符串末尾为空 出身背景,c#,string,C#,String,当我注意到数组中的最后一个点是”时,我正在使用分隔字符串并使用string.Split将每个子字符串放入数组中。由于我在数组的最后一个索引中寻找一个特定的子字符串,我最终遇到了解释所有字符串都以string.Empty结尾的帖子,所以我的结果很差 实例 下面显示了此行为的实际情况。当我拆分句子并将每个子字符串写入控制台时,我们可以看到最后一个元素是空字符串: public class Program { static void Main(string[] args) {
”
时,我正在使用分隔字符串并使用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”
?
它周围有一个“修复”来获得我想要的“真实”子字符串:
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();
}
}
公共类程序
{
静态void Main(字符串[]参数)
{
const string mySentence=“你好,这是我的字符串!”;
var wordArray=mycentence.Split(新[]{“,”,“!”},StringSplitOptions.None);
var wordList=新列表();
AddRange(wordArray);
RemoveAt(wordList.LastIndexOf(string.Empty));
foreach(单词列表中的var单词)
{
var消息=字;
if(word==string.Empty)message=“Empty string”;
控制台写入线(消息);
}
Console.ReadKey();
}
}
但是我仍然不明白为什么字符串的结尾会被处理为相同的行为,因为在它后面没有另一个需要空字符串的字符。它对编译器有什么作用吗?发生这种情况是因为您使用的是
StringSplitOptions。当您的一个分隔符值出现在字符串末尾时,无。该选项的全部目的是创建您正在观察的行为:它将包含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);
发生这种情况是因为您正在使用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(“!”)确实意味着什么。它意味着字符串以“!“空字符串是字符串的0
。它们无处不在
“ABC”等同于“ABC”+”或“ABC+++”,这是很自然的,就像3相当于3+0或3+0+0+0一样
事实上,在“Hello,this,is,my,string!“.Split(“!”)确实有意思。这意味着您的字符串以“!”结尾。“
是您好,这是我的字符串所以当字符串被、
和拆分时代码>结果是你好
,这个
,是
,我的
,字符串
,“
。“
是字符串结尾和之间的空字符代码>
如果你用一个可见的字符(比如说<代码>#《代码>代码>如果你用一个可见的字符(说<<代码><代码><代码><代码><代码><代码><代码><代码><代码><代码>代码>代码>代码>代码>如果你用一个可见的字符替换<代码>你的字符串你的字符串将看起来像你的字符串你的字符串将像这<代码>你的代码>H H H H h35hh H H h35#H#H#H#h35;H#埃埃埃埃埃埃塞塞塞塞塞塞塞塞塞塞塞塞基基基基基基基基基基基基基基基基基基基基基基基基基基基基基基基基基基基基基基基基基基基基基基基哈哈哈哈哈埃埃埃埃埃埃埃#g##
“
是的每个字母之间的间隔你好,这是我的字符串所以当字符串被、
和拆分时代码>结果是你好
,这个
,是
,我的
,字符串
,“
。“
是字符串结尾和之间的空字符代码>
如果你用一个可见的字符(比如说<代码>#《代码>代码>如果你用一个可见的字符(说<<代码><代码><代码><代码><代码><代码><代码><代码><代码><代码>代码>代码>代码>代码>如果你用一个可见的字符替换<代码>你的字符串你的字符串将看起来像你的字符串你的字符串将像这<代码>你的代码>H H H H h35hh H H h35#H#H#H#h35;H#埃埃埃埃埃埃塞塞塞塞塞塞塞塞塞塞塞塞基基基基基基基基基基基基基基基基基基基基基基基基基基基基基基基基基基基基基基基基基基基基基基基哈哈哈哈哈埃埃埃埃埃埃埃#g##代码>