1

I think I solved my main issue although I do not understand it enough so I shall ask someone here to point me to a good explanation or explain to me like I am 5.

Consider the following...

 String myString = "something that thing, another thing"; 
 Console.WriteLine(myString.SubString(0, myString.Length)); 

The above will just print out the whole string, that's fine. I didn't make any real changes to myString.

Continuing, with the same myString

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

That would give me "something that thing" as expected.

Now here comes the silly part, because to my understanding I never changed myString by using LastIndexOf() or .Length

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

That will throw an ArgumentOutOfIndexExpcetion. Because apparently I changed myString... So that now... the proper way to get the half of the string after the ',' is by doing...

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

Main question

Why the hell did I need to reformat my index if I never changed myString to begin with... Aren't all methods within the String class made so that the String never changes.

SO the Java subString is different? since its beginindex to endindex... http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#substring(int,%20int)

Ya Wang
  • 1,758
  • 1
  • 19
  • 41
  • Good example of an instance where Java makes more sense than C#. Java - substring(int startIndex, int endIndex) is more efficient than it's C# counterpart in my opinion. – scubasteve623 Aug 27 '15 at 15:49

5 Answers5

3

Probably you're looking for

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

which means: "start from myString.LastIndexOf(',') and up to the end of the string".

Dmitry Bychenko
  • 180,369
  • 20
  • 160
  • 215
2

It's a really simple error. The Substring(int startIndex, int length) is guaranteed to throw ArgumentOutOfRangeException when

startIndex plus length indicates a position not within this instance.

Which is exactly what you're seeing: last index of "," plus the total length of the string exceed the total length of the string you're Substringing from.

Anton Gogolev
  • 113,561
  • 39
  • 200
  • 288
2

You aren't reformatting your index, you're reformatting the length of the string you're taking. The SubString method accepts a starting index and a length. So in your code:

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

You're starting at the last index of the character ',', but you're still telling it to take the entire length of the string. It can't do that. You're telling it to start at the 21st character and take the next 35. Your string would have to have 56 characters in order to do that.

Joel Etherton
  • 37,325
  • 10
  • 89
  • 104
0

The problem is that that style of Substring is only performed by JS/Java, so far as I know. The signature of Substring in .Net is:

string Substring(int index, int length);

That means .Net (and most other standard libraries) will grab the string from index until index + length. index + length is past the end of the string and hence you receive the exception. What you are possibly looking for is this:

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

Which will grab everything after the last occurrence of ','. If ',' does not occur it will give you the whole string. If you don't specify the length argument, Substring will give you everything from the index you specify up until the end of the string.

Jonathan Dickinson
  • 9,050
  • 1
  • 37
  • 60
0

Yes, I find myself doing this a lot

text = text.substring(text.indexOf(something),text.indexOf(somethingElse));

Whereas C# is

text = text.Substring(text.IndexOf(something),text.Length - text.IndexOf(somethingElse));

Java has it's own stuff that annoys me too though. Why string == is by reference and not by value, I'll never understand.

scubasteve623
  • 637
  • 4
  • 7