string.LastIndexOf(char value, int startIndex, int count); started giving me some behaviour I wasn't expecting when it started giving me an ArgumentOutOfRangeException Exception with a description of: "Count must be positive and count must refer to a location within the string/array/collection."
Let me give you an example:
var message = ".NET is unusually faultless!"; var maxSearch = 16; var count = message.LastIndexOf('l', 0, maxSearch); var newMsg = message.Substring(0, count);
This should work right? What could be wrong with this? Well according to IntelliSense "Reports the index position of the last occurrence of the specified Unicode character in a substring within this instance. The search starts at a specified character position and examines a specified number of character positions." Hmm.. Okay. And the count parameter that I am getting wrong? "The number of character positions to examine." Seems legit.
I decided to disassemble .NET to have a peep at what's going on internally... Have I found a bug in .NET?! Can't tell because the method is extern, so I cannot look at it. I instead did some experimenting and worked it out.
How to properly use LastIndexOf
Turns out I was just using it incorrectly and blaming my tools. Although I am convinced some blame lies with IntelliSense for forgetting to mention that LastIndexOf searches backwards through the string! Should I have known that? I don't know. Anyway this is what I should have written:
var message = ".NET is unusually faultless!"; var maxSearch = 16; var count = message.LastIndexOf('l', maxSearch, maxSearch); var newMsg = message.Substring(0, count);
The startIndex parameter should be at the last point you want to search backwards from. The count then specifies the amount of chars for your search to go back through.
Maybe I'm just being stupid or maybe it is just that