String.LastIndexOfAny Method (Char[], Int32, Int32) (System)

Switch View :
ScriptFree
.NET Framework Class Library
String.LastIndexOfAny Method (Char[], Int32, Int32)

Updated: June 2010

Reports the zero-based index position of the last occurrence in this instance of one or more characters specified in a Unicode array. The search starts at a specified character position and examines a specified number of character positions.

Namespace:  System
Assembly:  mscorlib (in mscorlib.dll)
Syntax

Visual Basic
Public Function LastIndexOfAny ( _
	anyOf As Char(), _
	startIndex As Integer, _
	count As Integer _
) As Integer
C#
public int LastIndexOfAny(
	char[] anyOf,
	int startIndex,
	int count
)
Visual C++
public:
int LastIndexOfAny(
	array<wchar_t>^ anyOf, 
	int startIndex, 
	int count
)
F#
member LastIndexOfAny : 
        anyOf:char[] * 
        startIndex:int * 
        count:int -> int 

Parameters

anyOf
Type: System.Char[]
A Unicode character array containing one or more characters to seek.
startIndex
Type: System.Int32
The search starting position.
count
Type: System.Int32
The number of character positions to examine.

Return Value

Type: System.Int32
The index position of the last occurrence in this instance where any character in anyOf was found; -1 if no character in anyOf was found or if the current instance equals String.Empty.
Exceptions

Exception Condition
ArgumentNullException

anyOf is null.

ArgumentOutOfRangeException

The current instance does not equal String.Empty, and count or startIndex is negative.

-or-

The current instance does not equal String.Empty and startIndex minus count specifies a position that is not within this instance.

Remarks

Index numbering starts from zero.

This method begins searching at the startIndex character position of this instance and proceeds backward toward the beginning until either a character in anyOf is found or count character positions have been examined. The search is case-sensitive.

This method performs an ordinal (culture-insensitive) search, where a character is considered equivalent to another character only if their Unicode scalar values are the same. To perform a culture-sensitive search, use the CompareInfo.LastIndexOf method, where a Unicode scalar value representing a precomposed character, such as the ligature "Æ" (U+00C6), might be considered equivalent to any occurrence of the character's components in the correct sequence, such as "AE" (U+0041, U+0045), depending on the culture.

Examples

The following example finds the index of the last occurrence of any character in the string "aid" within a substring of another string.

Visual Basic

' Sample for String.LastIndexOfAny(Char[], Int32, Int32)
Imports System
 _

Class Sample

   Public Shared Sub Main()

      Dim br1 As String = "0----+----1----+----2----+----3----+----4----+----5----+----6----+-"
      Dim br2 As String = "0123456789012345678901234567890123456789012345678901234567890123456"
      Dim str As String = "Now is the time for all good men to come to the aid of their party."
      Dim start As Integer
      Dim at As Integer
      Dim count As Integer
      Dim target As String = "aid"
      Dim anyOf As Char() = target.ToCharArray()

      start =(str.Length - 1) * 2 / 3
      count =(str.Length - 1) / 3
      Console.WriteLine("The last character occurrence from position {0} for {1} characters.", start, count)
      Console.WriteLine("{1}{0}{2}{0}{3}{0}", Environment.NewLine, br1, br2, str)
      Console.Write("A character in '{0}' occurs at position: ", target)

      at = str.LastIndexOfAny(anyOf, start, count)
      If at > - 1 Then
         Console.Write(at)
      Else
         Console.Write("(not found)")
      End If
      Console.Write("{0}{0}{0}", Environment.NewLine)
   End Sub 'Main
End Class 'Sample
'
'This example produces the following results:
'The last character occurrence from position 44 for 22 characters.
'0----+----1----+----2----+----3----+----4----+----5----+----6----+-
'0123456789012345678901234567890123456789012345678901234567890123456
'Now is the time for all good men to come to the aid of their party.
'
'A character in 'aid' occurs at position: 27
'


C#

// Sample for String.LastIndexOfAny(Char[], Int32, Int32)
using System;

class Sample {
    public static void Main() {

    string br1 = "0----+----1----+----2----+----3----+----4----+----5----+----6----+-";
    string br2 = "0123456789012345678901234567890123456789012345678901234567890123456";
    string str = "Now is the time for all good men to come to the aid of their party.";
    int start;
    int at;
    int count;
    string target = "aid";
    char[] anyOf = target.ToCharArray();

    start = ((str.Length-1)*2)/3;
    count = (str.Length-1)/3;
    Console.WriteLine("The last character occurrence from position {0} for {1} characters.", start, count);
    Console.WriteLine("{1}{0}{2}{0}{3}{0}", Environment.NewLine, br1, br2, str);
    Console.Write("A character in '{0}' occurs at position: ", target);

    at = str.LastIndexOfAny(anyOf, start, count);
    if (at > -1) 
        Console.Write(at);
    else
        Console.Write("(not found)");
    Console.Write("{0}{0}{0}", Environment.NewLine);
    }
}
/*
This example produces the following results:
The last character occurrence from position 44 for 22 characters.
0----+----1----+----2----+----3----+----4----+----5----+----6----+-
0123456789012345678901234567890123456789012345678901234567890123456
Now is the time for all good men to come to the aid of their party.

A character in 'aid' occurs at position: 27
*/


Visual C++

// Sample for String::LastIndexOfAny(Char[], Int32, Int32)
using namespace System;
int main()
{
   String^ br1 = "0----+----1----+----2----+----3----+----4----+----5----+----6----+-";
   String^ br2 = "0123456789012345678901234567890123456789012345678901234567890123456";
   String^ str = "Now is the time for all good men to come to the aid of their party.";
   int start;
   int at;
   int count;
   String^ target = "aid";
   array<Char>^anyOf = target->ToCharArray();
   start = ((str->Length - 1) * 2) / 3;
   count = (str->Length - 1) / 3;
   Console::WriteLine( "The last character occurrence from position {0} for {1} characters.", start, count );
   Console::WriteLine( "{1}{0}{2}{0}{3}{0}", Environment::NewLine, br1, br2, str );
   Console::Write( "A character in '{0}' occurs at position: ", target );
   at = str->LastIndexOfAny( anyOf, start, count );
   if ( at > -1 )
      Console::Write( at );
   else
      Console::Write( "(not found)" );

   Console::Write( "{0}{0}{0}", Environment::NewLine );
}

/*
This example produces the following results:
The last character occurrence from position 44 for 22 characters.
0----+----1----+----2----+----3----+----4----+----5----+----6----+-
0123456789012345678901234567890123456789012345678901234567890123456
Now is the time for all good men to come to the aid of their party.

A character in 'aid' occurs at position: 27
*/


Version Information

.NET Framework

Supported in: 4, 3.5, 3.0, 2.0, 1.1, 1.0

.NET Framework Client Profile

Supported in: 4, 3.5 SP1

Portable Class Library

Supported in: Portable Class Library
Platforms

Windows 7, Windows Vista SP1 or later, Windows XP SP3, Windows XP SP2 x64 Edition, Windows Server 2008 (Server Core not supported), Windows Server 2008 R2 (Server Core supported with SP1 or later), Windows Server 2003 SP2

The .NET Framework does not support all versions of every platform. For a list of the supported versions, see .NET Framework System Requirements.
See Also

Reference

Change History

Date

History

Reason

June 2010

Noted that an exception is not thrown for an empty string if the index or length parameter is invalid.

Content bug fix.

Community Content

R Petrusha - MSFT
Proceeds Backwards...

I have asked a handful of people what they assumed startIndex should be. I allowed them to read the summary and parameter comments. 100% of the people I asked assumed that startIndex did not start at the end of the range, rather the beginning. The point is that this should be made far more explicit in the summary, rather than hidden in a remark.

A simple transformation is to add the count to the start index and subtract 1, which places the start index where this method expects it. This is far more intuitive and more aligns with the IndexOfAny method interface. The same could be said for the other overloads, too, of course.

The Documentation for LastIndexOf and LastIndexOfAny

Thanks for pointing this out. It is true that the startIndex parameter, at least when compared with similar parameters in other methods, is idiosyncratic, and that most of the information needed to call the method successfully is contained in the Remarks section, where it is easily missed. We'll be modifying the method description and the startIndex parameter description for each relevant overload of both the LastIndexOf and LastIndexOfAny methods to note that the search begins at a specified character position and proceeds backward toward the beginning of the string. The updated documentation will appear online after the next documentation refresh.

--Ron Petrusha
Common Language Runtime User Education
Microsoft Corporation