Я знаю, что понятие String.Split было рассмотрено ранее с помощью множества различных подходов, но меня особенно интересует решение LINQ для этого вопроса.
Я попытался написать класс расширения для обработки split, но обе попытки имеют некоторые серьезные проблемы. Итак, для следующего:
string s = "ABCDEFGHIJKLMNOPQRSTUVWX";
var results = s.SplitEvery(4);
Мне нужен список вроде: { "ABCD", "EFGH", "IJKL", "MNOP", "QRST", "UVWX" }
Вот мой класс расширения:
public static class Extensions
{
public static List<string> SplitEvery(this string s, int n)
{
List<string> list = new List<string>();
var Attempt1 = s.Select((c, i) => i % n== 0 ? s.Substring(i, n) : "|").Where(x => x != "|").ToList();
var Attempt2 = s.Where((c, i) => i % n== 0).Select((c, i) => s.Substring(i, n)).ToList();
return list;
}
}
Попытка 1 вставляет фиктивную строку "|" каждый раз, когда условие не выполняется, затем удаляет все экземпляры фиктивной строки для создания окончательного списка. Он работает, но создание плохих строк кажется ненужным дополнительным шагом. Кроме того, эта попытка не выполняется, если строка не делится на n.
Попытка 2 заключалась в том, что я пытался выбрать только подстроки, где индекс был делимым на N, но значение "i" в выражении Select не соответствует значению "i" в инструкции Where, поэтому я получаю результаты как: { "ABCD", "BCDE" и т.д.}}
Мне кажется, что я близок к хорошему решению, но могу использовать полезный толчок в правильном направлении. Любые предложения?
[изменить]
В итоге у меня появилось сочетание предложений для обработки моего разделителя строк. Это может быть не самый быстрый, но, как новичок в LINQ, эта реализация была наиболее кратким и понятным для меня.
public static List<string> SplitEvery(this string s, int size)
{
return s.Select((x, i) => i)
.Where(i => i % size == 0)
.Select(i => String.Concat(s.Skip(i).Take(size))).ToList();
}
Спасибо за все прекрасные предложения.