See code, you see what it is for ;). I did it because .NET had not this kind of method…
using System; using System.Text; namespace FormatReplaceSandbox { class Program { static void Main(string[] args) { Console.WriteLine( "Ala ma kota, a kot ma Ale" .FormatReplace("ma k{0}a, a k{1} m", "ocur", "ocur")); Console.WriteLine( "Ala ma kota, a kot ma Ale" .FormatReplace("Ala ma {0}, a {1} ma Ale", "psa", "pies")); Console.WriteLine( "Ala ma kota, a kot ma Ale" .FormatReplace("{0} ma kota, a kot ma {1}", "Patrycja", "Patrycję")); Console.ReadKey(true); } } public static class FormatReplaceHelper { public static string FormatReplace( this string text, string format, params object[] args) { int count = 0; int partB = 0; int length = 0; var builder = new StringBuilder(); for (int i = 0; i < args.Length; ++i) { var pPattern = string.Concat("{", count.ToString(), "}"); var pBegin = format.IndexOf(pPattern, partB); var pLength = pPattern.Length; var pBeginPart = format.Substring(partB, pBegin - partB); var pBeginPartLength = pBeginPart.Length; var npPattern = string.Concat("{", (++count).ToString(), "}"); var npBegin = format.IndexOf(npPattern, partB); var pePart = npBegin != -1 ? format.Substring(pBegin + pLength, npBegin - pBegin - pLength) : format.Substring(pBegin + pLength, format.Length - pBegin - pLength); var paramEndPartLength = pePart.Length; var rbIndex = text.IndexOf(pBeginPart, partB); if (rbIndex == -1) break; rbIndex += pBeginPartLength; var reIndex = text.IndexOf(pePart, partB); if (reIndex == -1) break; reIndex += paramEndPartLength; builder.Append(text.Substring(partB, rbIndex - partB)); var param = args[i].ToString(); length = rbIndex + pLength; if (length < reIndex) length = reIndex; builder.Append(param); builder.Append(pePart); if (npBegin == -1) break; partB = npBegin; } if (length < text.Length) { builder.Append(text.Substring(length, text.Length - length)); } return builder.ToString(); } } }
P ;).