2012-08-02 75 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; 
    } 

我已经尝试过了,它似乎工作对我很好,所以你应该能够公正复制并粘贴并按原样使用它。不知道它有多快,但它至少起作用。

我希望你觉得这有用/有帮助。

相关问题