CompareInfo::LastIndexOf Method (String, String, CompareOptions)
Searches for the specified substring and returns the zero-based index of the last occurrence within the entire source string using the specified CompareOptions value.
Assembly: mscorlib (in mscorlib.dll)
Parameters
- source
- Type: System::String
The string to search.
- value
- Type: System::String
The string to locate within source.
- options
- Type: System.Globalization::CompareOptions
The CompareOptions value that defines how source and value should be compared. options is either the value Ordinal used by itself, or the bitwise combination of one or more of the following values: IgnoreCase, IgnoreSymbols, IgnoreNonSpace, IgnoreWidth, and IgnoreKanaType.
Return Value
Type: System::Int32The zero-based index of the last occurrence of value within the entire source using the specified CompareOptions value, if found; otherwise, -1.
| Exception | Condition |
|---|---|
| ArgumentNullException | source is nullptr. -or- value is nullptr. |
| ArgumentException | options contains an invalid CompareOptions value. |
The source string is searched backward starting at the end of the string and ending at the beginning of the string.
The CompareOptions::StringSort value is not valid for this method.
If options does not include the Ordinal value, this overload performs a culture-sensitive search. A Unicode 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. If options includes the Ordinal value, this overload performs an ordinal (culture-insensitive) search, where the Unicode values are compared.
With culture-sensitive searches, if value contains characters that are ignorable, then the search is equivalent to searching for a pattern with all the ignorable characters removed. If this is the empty string, then the return value is the offset of the last character within source.
Note |
|---|
When possible, the application should use string comparison methods that accept a CompareOptions value to specify the kind of comparison expected. As a general rule, user-facing comparisons are best served by the use of linguistic options (using the current culture), while security comparisons should specify Ordinal or OrdinalIgnoreCase. |
The following code example determines the indexes of the first and last occurrences of a character or a substring within a string.
using namespace System; using namespace System::Globalization; void PrintMarker( String^ Prefix, int First, int Last ) { // Determines the size of the array to create. int mySize; if ( Last > First ) mySize = Last; else mySize = First; if ( mySize > -1 ) { // Creates an array of Char to hold the markers. array<Char>^myCharArr = gcnew array<Char>(mySize + 1); // Inserts the appropriate markers. if ( First > -1 ) myCharArr[ First ] = 'f'; if ( Last > -1 ) myCharArr[ Last ] = 'l'; if ( First == Last ) myCharArr[ First ] = 'b'; // Displays the array of Char as a String. Console::WriteLine( "{0}{1}", Prefix, gcnew String( myCharArr ) ); } else Console::WriteLine( Prefix ); } int main() { // Creates CompareInfo for the InvariantCulture. CompareInfo^ myComp = CultureInfo::InvariantCulture->CompareInfo; // Searches for the ligature Æ. String^ myStr = "Is AE or ae the same as Æ or æ?"; Console::WriteLine(); Console::WriteLine( "No options : {0}", myStr ); PrintMarker( " AE : ", myComp->IndexOf( myStr, "AE" ), myComp->LastIndexOf( myStr, "AE" ) ); PrintMarker( " ae : ", myComp->IndexOf( myStr, "ae" ), myComp->LastIndexOf( myStr, "ae" ) ); PrintMarker( " Æ : ", myComp->IndexOf( myStr, L'Æ' ), myComp->LastIndexOf( myStr, L'Æ' ) ); PrintMarker( " æ : ", myComp->IndexOf( myStr, L'æ' ), myComp->LastIndexOf( myStr, L'æ' ) ); Console::WriteLine( "Ordinal : {0}", myStr ); PrintMarker( " AE : ", myComp->IndexOf( myStr, "AE", CompareOptions::Ordinal ), myComp->LastIndexOf( myStr, "AE", CompareOptions::Ordinal ) ); PrintMarker( " ae : ", myComp->IndexOf( myStr, "ae", CompareOptions::Ordinal ), myComp->LastIndexOf( myStr, "ae", CompareOptions::Ordinal ) ); PrintMarker( " Æ : ", myComp->IndexOf( myStr, L'Æ', CompareOptions::Ordinal ), myComp->LastIndexOf( myStr, L'Æ', CompareOptions::Ordinal ) ); PrintMarker( " æ : ", myComp->IndexOf( myStr, L'æ', CompareOptions::Ordinal ), myComp->LastIndexOf( myStr, L'æ', CompareOptions::Ordinal ) ); Console::WriteLine( "IgnoreCase : {0}", myStr ); PrintMarker( " AE : ", myComp->IndexOf( myStr, "AE", CompareOptions::IgnoreCase ), myComp->LastIndexOf( myStr, "AE", CompareOptions::IgnoreCase ) ); PrintMarker( " ae : ", myComp->IndexOf( myStr, "ae", CompareOptions::IgnoreCase ), myComp->LastIndexOf( myStr, "ae", CompareOptions::IgnoreCase ) ); PrintMarker( " Æ : ", myComp->IndexOf( myStr, L'Æ', CompareOptions::IgnoreCase ), myComp->LastIndexOf( myStr, L'Æ', CompareOptions::IgnoreCase ) ); PrintMarker( " æ : ", myComp->IndexOf( myStr, L'æ', CompareOptions::IgnoreCase ), myComp->LastIndexOf( myStr, L'æ', CompareOptions::IgnoreCase ) ); // Searches for the combining character sequence Latin capital letter U with diaeresis or Latin small letter u with diaeresis. myStr = "Is U\u0308 or u\u0308 the same as \u00DC or \u00FC?"; Console::WriteLine(); Console::WriteLine( "No options : {0}", myStr ); PrintMarker( " U\u0308 : ", myComp->IndexOf( myStr, "U\u0308" ), myComp->LastIndexOf( myStr, "U\u0308" ) ); PrintMarker( " u\u0308 : ", myComp->IndexOf( myStr, "u\u0308" ), myComp->LastIndexOf( myStr, "u\u0308" ) ); PrintMarker( " Ü : ", myComp->IndexOf( myStr, L'Ü' ), myComp->LastIndexOf( myStr, L'Ü' ) ); PrintMarker( " ü : ", myComp->IndexOf( myStr, L'ü' ), myComp->LastIndexOf( myStr, L'ü' ) ); Console::WriteLine( "Ordinal : {0}", myStr ); PrintMarker( " U\u0308 : ", myComp->IndexOf( myStr, "U\u0308", CompareOptions::Ordinal ), myComp->LastIndexOf( myStr, "U\u0308", CompareOptions::Ordinal ) ); PrintMarker( " u\u0308 : ", myComp->IndexOf( myStr, "u\u0308", CompareOptions::Ordinal ), myComp->LastIndexOf( myStr, "u\u0308", CompareOptions::Ordinal ) ); PrintMarker( " Ü : ", myComp->IndexOf( myStr, L'Ü', CompareOptions::Ordinal ), myComp->LastIndexOf( myStr, L'Ü', CompareOptions::Ordinal ) ); PrintMarker( " ü : ", myComp->IndexOf( myStr, L'ü', CompareOptions::Ordinal ), myComp->LastIndexOf( myStr, L'ü', CompareOptions::Ordinal ) ); Console::WriteLine( "IgnoreCase : {0}", myStr ); PrintMarker( " U\u0308 : ", myComp->IndexOf( myStr, "U\u0308", CompareOptions::IgnoreCase ), myComp->LastIndexOf( myStr, "U\u0308", CompareOptions::IgnoreCase ) ); PrintMarker( " u\u0308 : ", myComp->IndexOf( myStr, "u\u0308", CompareOptions::IgnoreCase ), myComp->LastIndexOf( myStr, "u\u0308", CompareOptions::IgnoreCase ) ); PrintMarker( " Ü : ", myComp->IndexOf( myStr, L'Ü', CompareOptions::IgnoreCase ), myComp->LastIndexOf( myStr, L'Ü', CompareOptions::IgnoreCase ) ); PrintMarker( " ü : ", myComp->IndexOf( myStr, L'ü', CompareOptions::IgnoreCase ), myComp->LastIndexOf( myStr, L'ü', CompareOptions::IgnoreCase ) ); } /* This code produces the following output. No options : Is AE or ae the same as Æ or æ? AE : f l ae : f l Æ : f l æ : f l Ordinal : Is AE or ae the same as Æ or æ? AE : b ae : b Æ : b æ : b IgnoreCase : Is AE or ae the same as Æ or æ? AE : f l ae : f l Æ : f l æ : f l No options : Is U" or u" the same as Ü or ü? U" : f l u" : f l Ü : f l ü : f l Ordinal : Is U" or u" the same as Ü or ü? U" : b u" : b Ü : b ü : b IgnoreCase : Is U" or u" the same as Ü or ü? U" : f l u" : f l Ü : f l ü : f l */
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.
Note