¿Cómo se realiza el reemplazo de cadenas en solo una subsección de una cadena?

Me gustaría un método eficiente que funcione de esta manera.

EDIT: Lo siento, no puse lo que había intentado antes. Actualicé el ejemplo ahora.

// Method signature, Only replaces first instance or how many are specified in max
public int MyReplace(ref string source,string org, string replace, int start, int max)
{
     int ret = 0;
     int len = replace.Length;
     int olen = org.Length;
     for(int i = 0; i < max; i++)
     {
          // Find the next instance of the search string
          int x = source.IndexOf(org, ret + olen);
          if(x > ret)
             ret = x;
          else
             break;

         // Insert the replacement
         source = source.Insert(x, replace);
         // And remove the original
         source = source.Remove(x + len, olen); // removes original string
     }
     return ret;
}

string source = "The cat can fly but only if he is the cat in the hat";
int i = MyReplace(ref source,"cat", "giraffe", 8, 1); 

// Results in the string "The cat can fly but only if he is the giraffe in the hat"
// i contains the index of the first letter of "giraffe" in the new string

La única razón por la que pregunto es porque mi implementación, me imagino, se vuelve lenta con miles de reemplazos.

Respuestas a la pregunta(5)

Su respuesta a la pregunta