IndexOfAny
This C# method searches a string
for many values. It returns the first position of any of the values you provide (or -1).
Several overloads of the IndexOfAny
method are available in .NET. This method is useful in certain C# programs—its performance is not great.
IndexOfAny
is an instance method that returns an integer value type indicating the position of the found character, or the special value -1 if no value was found.
char
array separately and reuse it whenever calling IndexOfAny
.IndexOfAny
method is called and searches for the lowercase "c" and uppercase "Z" in the 2 input strings.using System; // Input. const string value1 = "abc"; const string value2 = "XYZ"; // Find first location of "c" or "Z." int index1 = value1.IndexOfAny(new char[] { 'c', 'Z' }); Console.WriteLine(index1); // Repeat on another string. int index2 = value2.IndexOfAny(new char[] { 'c', 'Z' }); Console.WriteLine(index2);2 2
IndexOfAny
benchmarkConsider now the performance of IndexOfAny
. Can this method be used in performance-critical string
methods? We test its performance.
IndexOfAny
with a new char
array allocation as the argument, and test the result.for
-loop with an if
-statement and several conditions in the logic.IndexOfAny
method seems to perform much worse than a for
-loop with an if
-statement. For a simple search, it is far slower.IndexOfAny
method's performance will likely be more competitive.using System; using System.Diagnostics; const int _max = 1000000; string test = "abcdefg"; // Version 1: test IndexOfAny. var s1 = Stopwatch.StartNew(); for (int i = 0; i < _max; i++) { int result = test.IndexOfAny(new char[] { 'd', 'x', '?' }); if (result != 3) { return; } } s1.Stop(); // Version 2: test custom loop with if-statement. var s2 = Stopwatch.StartNew(); for (int i = 0; i < _max; i++) { int result = -1; for (int x = 0; x < test.Length; x++) { if (test[x] == 'd' || test[x] == 'x' || test[x] == '?') { result = x; break; } } if (result != 3) { return; } } s2.Stop(); Console.WriteLine(s1.Elapsed.TotalMilliseconds); Console.WriteLine(s2.Elapsed.TotalMilliseconds);36.7644 ms IndexOfAny 6.175 ms For-loop
IndexOfAny()
always performs a forward-only (left to right) scan of the input string. You can use the LastIndexOfAny
method for a reversed scan.
IndexOfAny
provides a way to scan an input string
declaratively for the first occurrence of any of the characters in the parameter char
array. This method reduces loop nesting.