string.split для чередующихся символов в c # - PullRequest
0 голосов
/ 05 марта 2012

Я знаю, что это будет простой ответ, но я новичок в C #. Существует много ответов для разных типов разбиений, но я не могу найти один для этой проблемы. Я пытаюсь разделить строку на две части чередующимися символами.

Примером будет: string example = "stackoverflow", а на выходе будут "sakvrlo" и "tcoefo".

Если это нечетное количество символов, не имеет значения, если две новые строки имеют разную длину.

Спасибо!

Ответы [ 2 ]

5 голосов
/ 05 марта 2012
StringBuilder sb1 = new StringBuilder();
StringBuilder sb2 = new StringBuilder();

string source = "some string to split";

// ALTERNATE: if you want an explicitly typed char[]
// char[] source = "some string to split".ToCharArray();

for( int i = 0; i < source.Length; i++ )
{
   if( i % 2 == 0 )
   {
        sb1.Append( source[i] );
   }
   else
   {
        sb2.Append( source[i] );
   } 
}

Примечания:

  • Нет известного мне метода BCL, который бы делал это автоматически (например, string.SplitAlternating().

  • Поскольку размер строки известен, StringBuilders можно инициализировать с фиксированным размером буфера.

  • Решение LINQ (ответ @ usr) чище, но медленнее (если оноимеет значение, что, вероятно, редко).

  • Если производительность действительно имеет значение, возможно, самый быстрый способ - получить указатель на начало исходного массива char и выполнить итерацию, увеличивая два отдельных указателя.создается двумя массивами символов, объявленными с использованием stacalloc. Впоследствии эти два массива символов могут быть переданы в качестве аргумента конструктору строки. Обязательно добавьте нулевые терминаторы.

4 голосов
/ 05 марта 2012
var a = new string(source.Where((c,i) => i % 2 == 0).ToArray());
var b = new string(source.Where((c,i) => i % 2 != 0).ToArray());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...