Home
Search
C# IndexOf ExamplesCall the IndexOf method. IndexOf returns the first index of specified character or substring.
IndexOf. From the start to the end, the IndexOf method in C# searches one string for another. It returns the index of the string part, if one is found.
Return value. If the substring or char is not found, IndexOf returns -1. If we test for ">= 0," we can tell if the value was present.
An example. We use IndexOf to see if a string contains a word. Usually we want to know the exact result of IndexOf. We can store its result in an int local.
Part A IndexOf returns the location of the string "dog." It is located at index 4.
Part B We test the result of IndexOf against the special constant -1. The string "turnip" is not found, so we get -1.
C# program that uses IndexOf
using System; class Program { static void Main() { string value = "cat,dog"; // Part A: find index of dog. Console.WriteLine(value.IndexOf("dog")); // Part B: test not found value. if (value.IndexOf("turnip") == -1) { Console.WriteLine("?"); } } }
4 ?
While loop. We often use IndexOf in loops. We have to keep track of several values at once. This prevents us from searching the same parts over and over again.
While
Argument 1 The first argument to IndexOf here is the character we are searching for—in this case the lowercase letter "a."
Argument 2 This is the start index we want to search from in the source string. With the initial value 0, we begin at the first char.
Warning We must advance past the current character by adding 1 to the index. If we do not do this, we will get an infinite loop.
C# program that uses IndexOf in loop
using System; class Program { static void Main() { // The input string. string s = "I have a cat"; // Loop through all instances of the letter a. int i = 0; while ((i = s.IndexOf('a', i)) != -1) { // Print out the substring. Console.WriteLine(s.Substring(i)); // Increment the index. i++; } } }
ave a cat a cat at
Return value. This is -1 when IndexOf does not find anything, and the index if it does. Often an IndexOutOfRangeException can provoked by using the -1 in other code (like an array access).
So Please be careful when using IndexOf. It is probably better to check for negative one at least once in most places.
C# program that shows IndexOf return value
using System; class Program { static void Main() { string source = "big dog"; // See result of IndexOf method. Console.WriteLine("NOT FOUND: {0}", source.IndexOf("cat")); Console.WriteLine("FOUND: {0}", source.IndexOf("dog")); } }
NOT FOUND: -1 FOUND: 4
Substring. We can use IndexOf with the Substring method. Here we get the first substring that begins with a certain pattern or character.
Info The Substring method returns the rest of the string starting at a specified number.
Substring
C# program that uses Substring
using System; class Program { static void Main() { // Input. const string s = "I have a cat"; // Location of the letter c. int i = s.IndexOf('c'); // Remainder of string starting at c. string d = s.Substring(i); Console.WriteLine(d); } }
cat
Skip start. Often strings have leading characters that we know cannot contain the searched-for value. We can skip these chars. This will give a performance boost—less searching is needed.
C# program that skips start characters
using System; class Program { static void Main() { string value = ":100,200"; // Skip the first character with a startIndex of 1. int comma = value.IndexOf(',', 1); Console.WriteLine(comma); } }
4
Benchmark, for-loop. Should we prefer IndexOf over for-loops when-possible? Scanning a string is a common operation. Choosing the fastest code here could help many programs.
Version 1 Here we use a single-character iteration for-loop. We see the "for" and "if" keywords in the code.
Version 2 This version of the code uses the IndexOf() method with a single char argument to search a string.
Result It is more efficient to scan each character individually than to use IndexOf.
Note The internal code for IndexOf is more complex—it is harder to optimize for the compiler.
C# program that times for-loop, IndexOf
using System; using System.Diagnostics; class Program { const int _max = 1000000; static void Main() { string s = "abc.123.456.xyz"; // Version 1: use for-loop to count chars. var s1 = Stopwatch.StartNew(); for (int i = 0; i < _max; i++) { int c = 0; for (int e = 0; e < s.Length; e++) { if (s[e] == '.') { c++; } } } s1.Stop(); // Version 2: use IndexOf to count chars. var s2 = Stopwatch.StartNew(); for (int i = 0; i < _max; i++) { int c = 0; int e = 0; while ((e = s.IndexOf('.', e)) != -1) { e++; c++; } } s2.Stop(); // Result times. Console.WriteLine(((double)(s1.Elapsed.TotalMilliseconds * 1000000) / _max).ToString("0.00 ns")); Console.WriteLine(((double)(s2.Elapsed.TotalMilliseconds * 1000000) / _max).ToString("0.00 ns")); } }
18.21 ns: For-loop 26.78 ns: IndexOf, while-loop
Benchmark, char argument. Sometimes we are searching for a single character. We can specify this single character as a 1-char string, or a char.
Version 1 Here we invoke IndexOf with a char argument. We use a char instead of a string, but the output is the same.
Version 2 This version of the code calls IndexOf with a single-character string argument.
Result The string IndexOf will require more CPU cycles. And even if we pass in StringComparison.Ordinal, it is slower.
So A char argument is more efficient. Using a string is many times slower than using a char value.
C# program that times IndexOf, char versus string
using System; using System.Diagnostics; class Program { const int _max = 1000000; static void Main() { string value = "The puppy is adorable."; // Version 1: use char argument. var s1 = Stopwatch.StartNew(); for (int i = 0; i < _max; i++) { int result = value.IndexOf('a'); } s1.Stop(); // Version 2: use string argument. var s2 = Stopwatch.StartNew(); for (int i = 0; i < _max; i++) { int result = value.IndexOf("a"); } s2.Stop(); // Result times. Console.WriteLine(((double)(s1.Elapsed.TotalMilliseconds * 1000000) / _max).ToString("0.00 ns")); Console.WriteLine(((double)(s2.Elapsed.TotalMilliseconds * 1000000) / _max).ToString("0.00 ns")); } }
13.07 ns: IndexOf char argument 226.86 ns: IndexOf string argument
IndexOfAny. This method receives a char array argument. It searches for the first index of any of the characters provided in that array.
IndexOfAny
Note This method is similar to calling IndexOf several times with the logical OR operator.
However IndexOfAny has different performance characteristics. It may result in clearer code.
LastIndexOf. This works like IndexOf, but searches in reverse, from the right to the left part of the string. It starts with the last char.
LastIndexOf
Return LastIndexOf also returns -1 if the argument cannot be located. So it is the same except for search order.
Note The IndexOf method is actually a FirstIndexOf method. The name just omits the First.
LastIndexOfAny. This one searches in reverse, and tests the character array for any match. It returns the rightmost match possible from the array.
LastIndexOf
Contains. This is a wrapper method. It calls IndexOf with StringComparison.Ordinal. It returns true or false, not an integer. So it is a bit simpler to use.
Contains
Internals If Contains internal IndexOf returns -1 contains returns false. Otherwise it returns true.
Between, before and after. Substrings are relative to other parts of their original strings. With IndexOf and LastIndexOf, we can locate relative substrings.
Between, Before, After
Other IndexOf methods. We call IndexOf on strings, but we can also use (different) IndexOf methods on arrays and Lists. These also return -1 if nothing is found.
Array.IndexOf, LastIndexOf
List
IndexOf, review. We commonly use IndexOf to search for chars (or substrings) in strings. For complex problems, a for-loop may be easier to write and faster to execute.
A summary. There is no built-in string method called Search. But the general idea is performed by IndexOf, IndexOfAny, LastIndexOf and LastIndexOfAny.
Home
© 2007-2021 sam allen. see site info on the changelog