Why is this an issue?
Most checks against an IndexOf value compare it with -1 because 0 is a valid index.
strings.IndexOf(someString) = -1 ' Test for "index not found"
strings.IndexOf(someString) < 0 ' Test for "index not found"
strings.IndexOf(someString) >= 0 ' Test for "index found"
Any checks which look for values > 0 ignore the first element, which is likely a bug. If the intent is merely to check the
inclusion of a value in a String, List, or array, consider using the Contains method instead.
strings.Contains(someString) ' Boolean result
This rule raises an issue when the output value of any of the following methods is tested against > 0:
- IndexOf, applied to
String, list or array - IndexOfAny, applied to a
String - LastIndexOf, applied to a
String, list or array - LastIndexOfAny, applied to a
String
someArray.IndexOf(someItem) > 0 ' Noncompliant: index 0 missing
someString.IndexOfAny(charsArray) > 0 ' Noncompliant: index 0 missing
someList.LastIndexOf(someItem) > 0 ' Noncompliant: index 0 missing
someString.LastIndexOf(charsArray) > 0 ' Noncompliant: index 0 missing
How to fix it
Code examples
Noncompliant code example
Dim Color As String = "blue"
Dim Name As String = "ishmael"
Dim Strings As New List(Of String)
Strings.Add(Color)
Strings.Add(Name)
Dim StringArray As String() = Strings.ToArray()
If Strings.IndexOf(Color) > 0 Then ' Noncompliant
' ...
End If
If Name.IndexOf("ish") > 0 Then ' Noncompliant
' ...
End If
If Name.IndexOf("ae") > 0 Then ' Noncompliant
' ...
End If
If Array.IndexOf(StringArray, Color) > 0 Then ' Noncompliant
' ...
End If
Compliant solution
Dim Color As String = "blue"
Dim Name As String = "ishmael"
Dim Strings As New List(Of String)
Strings.Add(Color)
Strings.Add(Name)
Dim StringArray As String() = Strings.ToArray()
If Strings.IndexOf(Color) > -1 Then
' ...
End If
If Name.IndexOf("ish") >= 0 Then
' ...
End If
If Name.Contains("ae") Then
' ...
End If
If Array.IndexOf(StringArray, Color) >= 0 Then
' ...
End If