Looking for a given substring starting from a specified offset can be achieved by such code: ``str.Substring(startIndex).IndexOf(char1)``. This works well, but it creates a new ``string`` for each call to the ``Substring`` method. When this is done in a loop, a lot of ``strings`` are created for nothing, which can lead to performance problems if ``str`` is large. To avoid performance problems, ``string.Substring(startIndex)`` should not be chained with the following methods: - ``IndexOf`` - ``IndexOfAny`` - ``LastIndexOf`` - ``LastIndexOfAny`` For each of these methods, another method with an additional parameter is available to specify an offset. Using these methods gives the same result while avoiding the creation of additional ``String`` instances. == Noncompliant Code Example ---- str.Substring(StartIndex).IndexOf(char1); // Noncompliant; a new string is going to be created by "Substring" ---- == Compliant Solution ---- str.IndexOf(char1, startIndex) - startIndex; ----