.NET 早期版本 String.Split 僅支援單一字元或字元陣列做分隔符,無法直接用字串分割(如 "::"、"||")。本文提供一個自訂 Split 方法支援字串分隔符,並與 Regex.Split 進行效能比較。
using System;
using System.Collections;
namespace split
{
class mySplit
{
[STAThread]
static void Main(string[] args)
{
string str1 = "", str2 = "";
if (args.Length != 2)
{
Console.WriteLine("請輸入要分割的字串:");
str1 = Console.ReadLine();
Console.WriteLine("請輸入分割符:");
str2 = Console.ReadLine();
Console.WriteLine(" 分割出的資料如下: ");
}
else
{
str1 = args[0];
str2 = args[1];
}
string[] output = Split(str1, str2);
for (int i = 0; i < output.Length; i++)
Console.WriteLine("{0}", output[i]);
Console.WriteLine(" 被分割成{0}份字串!", output.Length);
// 效能測試
TimeSpan sp1, sp2;
DateTime dt = DateTime.Now;
for (int i = 0; i < 1000; i++)
{
output = Split(str1, str2);
output = null;
}
sp1 = DateTime.Now - dt;
Console.WriteLine(" 自訂 Split 耗時: {0}", sp1);
// Regex.Split 比較
System.Text.RegularExpressions.Regex rg = new System.Text.RegularExpressions.Regex("&&");
dt = DateTime.Now;
for (int j = 0; j < 1000; j++)
{
output = rg.Split(str1);
output = null;
}
sp2 = DateTime.Now - dt;
Console.WriteLine(" Regex.Split 耗時: {0}", sp2);
}
///
/// 使用字串分隔符分割字串
///
public static string[] Split(string source, string separator)
{
if (string.IsNullOrEmpty(separator))
return new string[] { source };
ArrayList result = new ArrayList();
int startIndex = 0;
while (true)
{
int index = source.IndexOf(separator, startIndex);
if (index == -1)
{
result.Add(source.Substring(startIndex));
break;
}
result.Add(source.Substring(startIndex, index - startIndex));
startIndex = index + separator.Length;
}
return (string[])result.ToArray(typeof(string));
}
}
}
IndexOf + Substring 迴圈,純 managed 程式碼,無正規表示式引擎開銷,短字串、簡單分隔符時極快。String.Split(string[], StringSplitOptions) 內建支援字串分隔符,現代專案請直接使用內建方法。
// .NET 2.0 以上內建支援字串分隔符
string[] parts = source.Split(new string[] { "::", "||" }, StringSplitOptions.None);
// 移除空白項目
string[] parts2 = source.Split(new string[] { "::" }, StringSplitOptions.RemoveEmptyEntries);
理解字串分割的演算法原理(尋找分隔符位置、擷取子字串)有助於在無內建支援的舊版環境或特殊需求下自行實作。現代 .NET 開發請優先使用 String.Split(string[]),僅在需要正規表示式威力時才引入 Regex.Split。