2012-08-02 68 views
0

給定一個sting,如何跳過前x個字符,然後爲每個y個字符插入一個值?跳過x個字符,然後爲c中的每個y字符插入一個字符串#

例如:

「Lorem ipsum dolor sit amet,」 
跳過第10個caracters然後indsert「[這裏]」每3個caracters成爲當

「Lorem ipsu[here]m d[here]olo[here]r s[here]it [here]ame[here]t,」 

什麼是最有效,最快捷的方式在C#中這樣做?

我目前的函數看起來是這樣,但不這樣做的跳躍部分,我知道如何實現跳躍部分,但似乎使用的技術不爲最優:

public static string InsertHere(string source) 
    { 
     if (string.IsNullOrWhiteSpace(source)) 
     { 
      return string.Empty; 
     } 

     int count = 0; 
     var sb = new StringBuilder(); 
     foreach (char c in source) 
     { 
      count++; 
      sb.Append(c); 
      if (count == 10) 
      { 
       count = 0; 
       sb.Append(@"[here]"); 
      } 
     } 
     return sb.ToString(); 
    } 
+0

@weston問題更新與我目前的實施,這不正確地解決問題 – 2012-08-02 08:17:15

+0

做跳過的問題是什麼?從最粗略的意義上講,如果你最初設置一個負數,它會有更多的進一步去之前,它首先命中10這基本上意味着跳過一些......它可能不是最好的方式,但它是* a *方式。而且我認爲在你的最後一件事情中你的十個實際上是三個? – Chris 2012-08-02 08:21:01

+1

當您查看某些給定解決方案所採用的速度時,您可能會發現,如果給定較大的輸入字符串,則某些解決方案會更好。對於你給的那種小字符串,我想你會很難推斷出許多論點。 – weston 2012-08-02 08:35:40

回答

0

你必須簡要介紹一下,看看什麼是最好的,但這是我的努力,我已經將字符串閱讀器變成了緩衝方法。

public static string InsertStringRepeatedly(string source, int skip, int insertEvery, string toInsert) 
    { 
     var sb = new StringBuilder(); 
     using (var sr = new StringReader(source)) 
     { 
      var buffer = new char[Math.Max(skip, insertEvery)]; 
      var read = sr.Read(buffer, 0, skip); 
      sb.Append(buffer, 0, read); 
      while (sr.Peek() > 0) 
      { 
       sb.Append(toInsert); 
       read = sr.Read(buffer, 0, insertEvery); 
       sb.Append(buffer, 0, read); 
      } 
     } 
     return sb.ToString(); 
    } 

編輯:

固定爲邊緣情況source.Length < 10或不10 + 3 * x的整數倍。現在也只使用一個緩衝區。

用例:

private static void Main(string[] args) 
    { 
     var result = InsertStringRepeatedly("Lorem ipsum dolor sit amet,", 10, 3, "[Here]"); 
     Console.Write("\""); 
     Console.Write(result); 
     Console.WriteLine("\""); //quotes to show we dealt with edge cases correctly 
     Console.ReadLine(); 
    } 
0

不知道它的速度更快(你真的需要這個基準):

static Regex Rx = new Regex("(^.{10}|.{3})", RegexOptions.Compiled); 

//... 
var result = Rx.Replace(input, "$0[here]"); 

在正則表達式的解決方案使用最佳速度的靜態編譯的正則表達式。

0

無需Regex。嘗試String方法更高的性能:

string str = "Lorem ipsum dolor sit amet,"; 
var rep = "[here]"; 

var step = 10 + rep.Length; 
while (str.Length > step) 
{ 
    str = str.Insert(step, rep); 
    step = step + 3 + rep.Length; 
} 
+0

不錯和短代碼,但對於較大的字符串,它將因缺乏'StringBuilder'使用而受到影響,因爲它會在每次迭代時創建一個新字符串。 – weston 2012-08-02 08:39:26

0

我想我也可以把我的修改到一個答案。

我要強調的是,這很可能不會做到這一點的最好方式,但它是你的代碼做的簡單的修改,肯定能行......

public static string InsertHere(string source, int skip, int repeatPeriod) 
{ 
    if (string.IsNullOrWhiteSpace(source)) 
    { 
     return string.Empty; 
    } 

    int count = -1*(skip-repeatPeriod); 
    var sb = new StringBuilder(); 
    foreach (char c in source) 
    { 
     count++; 
     sb.Append(c); 
     if (count == repeatPeriod) 
     { 
      count = 0; 
      sb.Append(@"[here]"); 
     } 
    } 
    return sb.ToString(); 
} 
0

我不是很精通用C#,但(我有一個VB背景),但是,想到的第一件事情是這樣的:

string WordProcess(string StringToProcess, string InsertValue, byte NumberToProcess) 
    { 
     string Result = ""; 
     while (StringToProcess != "") 
     { 
      for (byte b = 0; b < NumberToProcess; b++) 
      { 
       string TempString = StringToProcess; 
       Result += TempString.Remove(1, TempString.Length - 1); 
       StringToProcess = StringToProcess.Remove(0, 1); 
      } 
      Result += InsertValue; 
     } 
     return Result; 
    } 

我已經嘗試過了,它似乎工作對我很好,所以你應該能夠公正複製並粘貼並按原樣使用它。不知道它有多快,但它至少起作用。

我希望你覺得這有用/有幫助。

相關問題