String.Split()
, кажется, лучший вариант здесь, но просто для удовольствия, это также можно сделать с LINQ.
Одна из моих реализаций из String Calculator Kata использует этот подход (вообще не Split
).См. InternalAdd()
метод.Я принял функциональный подход с головой и хвостом.Вы делите строку на head и tail с помощью .Take()
и возвращаете head + рекурсивный результат вызова той же функции для tail.
Пример кода для одного разделителя символов приведен ниже (все усложняется, когда разделители становятся длиннее):
private IEnumerable<string> BreakString(string source)
{
var delimiter = '/';
var head = source.TakeWhile(c => c != delimiter);
if (!head.Any())
{
yield break;
}
var tail = source.SkipWhile(c => c != delimiter)
.Skip(1);
yield return String.Join("", head);
foreach (var t in BreakString(String.Join("", tail)))
{
yield return t;
}
}
// usage
from s in BreakString(source)
Вы также можете пойти дальше и избавиться от String.Join()
с помощью tail.Aggregate(new StringBuilder(), (sb, c) => sb.Append(c)).ToString();