C# 恼人的字符串子字符串&;索引

C# 恼人的字符串子字符串&;索引,c#,C#,我想我解决了我的主要问题,虽然我还不太明白,所以我会请这里的人给我一个好的解释,或者像我5岁一样给我解释 考虑以下几点 String myString = "something that thing, another thing"; Console.WriteLine(myString.SubString(0, myString.Length)); 上面的内容只会打印出整个字符串,这很好。我没有对我的字符串做任何真正的更改 继续,使用相同的myString Console.WriteL

我想我解决了我的主要问题,虽然我还不太明白,所以我会请这里的人给我一个好的解释,或者像我5岁一样给我解释

考虑以下几点

 String myString = "something that thing, another thing"; 
 Console.WriteLine(myString.SubString(0, myString.Length)); 
上面的内容只会打印出整个字符串,这很好。我没有对我的字符串做任何真正的更改

继续,使用相同的myString

Console.WriteLine(myString.SubString(0, myString.LastIndexOf(','))); 
这会给我带来预期的“东西”

现在是愚蠢的部分,因为据我所知,我从未使用LastIndexOf()或.Length来更改我的字符串

Console.WriteLine(myString.SubString(myString.LastIndexOf(','), myString.length)); 
这将引发一场辩论。因为很明显我改变了我的想法。。。所以现在。。。获取“,”后字符串的一半的正确方法是执行

Console.WriteLine(myString.SubString(myString.LastIndexOf(','), (myString.length - myString.LastIndexOf(',')))); 
主要问题

如果我从一开始就没有改变我的字符串,为什么我需要重新格式化我的索引。。。不是String类中的所有方法都可以使字符串永远不变

那么Java子字符串是不同的?从开始索引到结束索引。。。
这是一个非常简单的错误。保证在以下情况下抛出ArgumentOutOfRangeException

startIndex
plus
length
表示不在此实例中的位置


这正是您所看到的:“,”的最后一个索引加上字符串的总长度超过了从中提取的字符串的总长度。

这是一个非常简单的错误。保证在以下情况下抛出ArgumentOutOfRangeException

startIndex
plus
length
表示不在此实例中的位置


这正是您看到的:最后一个索引“,”加上字符串的总长度超过了从中提取的字符串的总长度。

您不是在重新格式化索引,而是在重新格式化所提取字符串的长度。
SubString
方法接受起始索引和长度。因此,在您的代码中:

Console.WriteLine(myString.SubString(myString.LastIndexOf(','), myString.length)); 

您从字符
的最后一个索引开始,'
,但您仍然告诉它获取字符串的整个长度。它不能那样做。你告诉它从第21个角色开始,然后是第35个角色。您的字符串必须有56个字符才能执行此操作。

您不是在重新格式化索引,而是在重新格式化要获取的字符串的长度。
SubString
方法接受起始索引和长度。因此,在您的代码中:

Console.WriteLine(myString.SubString(myString.LastIndexOf(','), myString.length)); 

您从字符
的最后一个索引开始,'
,但您仍然告诉它获取字符串的整个长度。它不能那样做。你告诉它从第21个角色开始,然后是第35个角色。您的字符串必须有56个字符才能执行此操作。

您可能正在寻找

  Console.WriteLine(myString.SubString(myString.LastIndexOf(','))); 

这意味着:“从
myString.LastIndexOf(',')
开始,一直到字符串的末尾。”

您可能正在查找

  Console.WriteLine(myString.SubString(myString.LastIndexOf(','))); 

这意味着:“从
myString.LastIndexOf(',')
开始,一直到字符串的结尾。”

问题是,据我所知,这种
子字符串的样式只由JS/Java执行。.Net中
子字符串的签名为:

string Substring(int index, int length);
这意味着.Net(以及大多数其他标准库)将从
index
直到
index+length
获取字符串<代码>索引+长度
超过字符串的末尾,因此您将收到异常。您可能正在寻找的是:

Console.WriteLine(myString.Substring(myString.LastIndexOf(',') + 1));

它将在最后一次出现“,”之后捕获所有内容。如果没有出现“,”,它将为您提供整个字符串。如果不指定
length
参数,
Substring
将为您提供从指定的
索引到字符串结尾的所有内容。

问题是,据我所知,这种
Substring
样式仅由JS/Java执行。.Net中
子字符串的签名为:

string Substring(int index, int length);
这意味着.Net(以及大多数其他标准库)将从
index
直到
index+length
获取字符串<代码>索引+长度
超过字符串的末尾,因此您将收到异常。您可能正在寻找的是:

Console.WriteLine(myString.Substring(myString.LastIndexOf(',') + 1));

它将在最后一次出现“,”之后捕获所有内容。如果没有出现“,”,它将为您提供整个字符串。如果不指定
length
参数,
Substring
将提供从指定的
索引到字符串末尾的所有内容。

是的,我发现自己经常这样做

text = text.substring(text.indexOf(something),text.indexOf(somethingElse));
而C#是


Java有它自己的东西,这也让我很恼火。为什么string==是通过引用而不是通过值,我永远不会理解。

是的,我发现自己经常这样做

text = text.substring(text.indexOf(something),text.indexOf(somethingElse));
而C#是


Java有它自己的东西,这也让我很恼火。为什么string==是通过引用而不是通过值,我永远不会理解。

但是Java子字符串是不同的?@YaWang C#不是Java的副本。但是Java子字符串是不同的?@YaWang C#不是Java的副本。Java比C#更有意义的实例就是一个很好的例子。在我看来,Java-substring(intstartindex,intendindex)比C#对应的更有效。这是一个很好的例子,说明Java比C#更有意义。在我看来,Java-substring(intstartindex,intendindex)比C#对应的更有效。