C# 字符串。字符串中为空
2天前,有一个问题与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可以介于字符串中的任何字符之间,这就是
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;
}