有個新入門的學弟,在群里發了這樣一個題目:
/*
*“出南門,走六步,見着六叔和六舅,叫聲六叔和六舅,借我六斗六升好綠豆;過了秋,打了豆,
* 還我六叔六舅六十六斗六升好綠 豆。”
* 有上面的字符串內容。使用StringBuilder拼接獲取里面所有的“舅”字和出現的次數。
* 例如:如果“和”字出現了6次,就輸出:和和和和和和6
*/
看題目,很簡單,很簡單。
應該是學校的老師給學生出的入門級題目。
考察的循環和string於stringbuilder之間的區別等等。
題目解法很簡單,常規解法就是循環一下,逐個匹配即可。
突然想,咱能不能不用循環呢?於是想了這個奇葩方法:
1 static class Program 2 { 3 public static T LuckGo<T>(this T t, Action<T> action) 4 { 5 action(t); 6 return t; 7 } 8 9 static void Main(string[] args) 10 { 11 /* 12 *“出南門,走六步,見着六叔和六舅,叫聲六叔和六舅,借我六斗六升好綠豆;過了秋,打了豆, 13 * 還我六叔六舅六十六斗六升好綠 豆。” 14 * 有上面的字符串內容。使用StringBuilder拼接獲取里面所有的“舅”字和出現的次數。 15 * 例如:如果“和”字出現了6次,就輸出:和和和和和和6 16 */ 17 18 19 new Lack() { Str = "舅", Charts = "“出南門,走六步,見着六叔和六舅,叫聲六叔和六舅,借我六斗六升好綠豆;過了秋,打了豆,還我六叔六舅六十六斗六升好綠豆。”" } 20 .LuckGo(f => f.Begin()) 21 .LuckGo(f => f.Str = "和") 22 .LuckGo(f => f.Begin()); 23 24 Console.ReadLine(); 25 } 26 27 } 28 29 public class Lack 30 { 31 /// <summary> 32 /// 目標字符 33 /// </summary> 34 public string Str { set; private get; } 35 /// <summary> 36 /// 源字符串 37 /// </summary> 38 public string Charts { set; private get; } 39 40 /// <summary> 41 /// 拆解方法 42 /// </summary> 43 public void Begin() 44 { 45 var strs = Charts.Replace(Str, "|").Split('|'); 46 var stringBuilder = new StringBuilder(); 47 for (var i = 0; i < strs.Length - 1; i++) 48 { 49 stringBuilder.Append(Str); 50 } 51 stringBuilder.Append(strs.Length - 1); 52 Console.WriteLine(stringBuilder.ToString()); 53 } 54 55 }
運行結果:
思路:
咱不用常規的for來循環,我們先用replace來替換目標字符,換成特殊的字節,然后用split來分組(這個split方法內部的實現過程我不清楚是如何完成的,可能也有循環的。)
然后直接組裝目標字符。完成輸出的數據。
結論:
理論上,這是應該可以提升效率的,但也不一定,因為replace和split方法內也是有循環的,個人認為,這樣寫,只是換了一種實現方式,效率應該不是很高。
請大牛講解replace和split了。