public int IndexOf(string value, int startIndex, int count, StringComparison comparisonType) { // Validate inputs if (value == null) { throw new ArgumentNullException(nameof(value)); } if (startIndex < 0 || startIndex > this.Length) { throw new ArgumentOutOfRangeException(nameof(startIndex), SR.ArgumentOutOfRange_Index); } if (count < 0 || startIndex > this.Length - count) { throw new ArgumentOutOfRangeException(nameof(count), SR.ArgumentOutOfRange_Count); } if (comparisonType == StringComparison.Ordinal) { int result = SpanHelpers.IndexOf( ref Unsafe.Add(ref this._firstChar, startIndex), count, ref value._firstChar, value.Length); return((result >= 0 ? startIndex : 0) + result); } switch (comparisonType) { case StringComparison.CurrentCulture: case StringComparison.CurrentCultureIgnoreCase: return(CultureInfo.CurrentCulture.CompareInfo.IndexOf(this, value, startIndex, count, GetCaseCompareOfComparisonCulture(comparisonType))); case StringComparison.InvariantCulture: case StringComparison.InvariantCultureIgnoreCase: return(CompareInfo.Invariant.IndexOf(this, value, startIndex, count, GetCaseCompareOfComparisonCulture(comparisonType))); case StringComparison.OrdinalIgnoreCase: return(CompareInfo.IndexOfOrdinal(this, value, startIndex, count, GetCaseCompareOfComparisonCulture(comparisonType) != CompareOptions.None)); default: throw new ArgumentException(SR.NotSupported_StringComparison, nameof(comparisonType)); } }