Basisalgorithmus würde Iterieren Zeichen lang sein, bis n-1 Registerkarten gefunden, dann Zeichen nehmen bis zum nächsten Tab oder das Ende der Zeichenfolge.
Je nach Anforderungen müssen Sie möglicherweise, wenn die Leistung entscheidend ist, einen Scanalgorithmus manuell implementieren.
Sie könnten überrascht sein, wie langsam die Saitenspaltung ist. Nun - es ist nicht nicht von selbst, sondern das Gesamtkonzept erfordert:
- Scannen bis zum Ende des Strings
- Erstellung aller der getrennten Teile auf Haufen
- sammelt Müll
Betrachten Sie den folgenden Benchmark der beiden Ansätze:
void Main()
{
string source = "Tomas\tNordstrom\tSweden\tEurope\tWorld";
var sw = Stopwatch.StartNew();
string result = null;
var n = 100000000;
for (var i = 0; i < n; i++)
{
result = FindBySplitting(source);
}
sw.Stop();
var splittingNsop = (double)sw.ElapsedMilliseconds/n * 1000000.0;
Console.WriteLine("Splitting. {0} ns/op",splittingNsop);
Console.WriteLine(result);
sw.Restart();
for (var i = 0; i < n; i++)
{
result = FindByScanning(source);
}
sw.Stop();
var scanningNsop = (double)sw.ElapsedMilliseconds/n * 1000000.0;
Console.WriteLine("Scanning. {0} ns/op",
scanningNsop);
Console.WriteLine(result);
Console.WriteLine("Scanning over splitting: {0}", splittingNsop/scanningNsop);
}
string FindBySplitting(string s)
{
return s.Split('\t')[3];
}
string FindByScanning(string s)
{
int l = s.Length, p = 0, q = 0, c = 0;
while (c++ < 4 - 1)
while (p < l && s[p++] != '\t')
;
for (q = p; q < l && s[q] != '\t'; q++)
;
return s.Substring(p, q - p);
}
Scan-Algorithmus in reinem C# implementiert Übertrifft die auf dem niedrigen Niveau um einen Faktor von 4,6 auf meinem niedrigen Laptop implementiert Spaltung:
Splitting. 174.81 ns/op
Europe
Scanning. 37.58 ns/op
Europe
Scanning over splitting: 4.65167642362959
Suchen Sie nach "String.Split". – InBetween
Aufteilen nach '\ t' und gehen Sie zu Index 3 –
Mögliches Duplikat von [Separate Zeichenfolge nach Tabulatorzeichen] (https://stackoverflow.com/questions/2797647/separate-string-by-tab-characters) – TNU