Это будет чисто процедурное решение:
private static IEnumerable<string> Tokenize(string text, string separators)
{
int startIdx = 0;
int currentIdx = 0;
while (currentIdx < text.Length)
{
// found a separator?
if (separators.Contains(text[currentIdx]))
{
// yield a substring, if it's not empty
if (currentIdx > startIdx)
yield return text.Substring(startIdx, currentIdx - startIdx);
// yield the separator
yield return text.Substring(currentIdx, 1);
// mark the beginning of the next token
startIdx = currentIdx + 1;
}
currentIdx++;
}
}
Обратите внимание, что это решение позволяет избежать возврата пустых токенов. Например, если введено:
string input = "test!!";
вызов Tokenize(input, "!")
вернет три токена:
test
!
!
Если требуется, чтобы между двумя соседними разделителями был пустой токен, условие if (currentIdx > startIdx)
должно быть удалено.