Ярлык для разделения только один раз в C#?

Хорошо, допустим, у меня есть строка:

string text = "one|two|three";

Если я сделаю string[] texts = text.Split('|'); В итоге я получу строковый массив из трех объектов. Однако это не то, что я хочу. Что я на самом деле хочу, так это разделить строку только один раз... так что два массива, которые я мог бы, были бы такими:

one
two|three

Кроме того, есть ли способ сделать одно разбиение с последним вхождением в строку? Итак, я получаю:

one|two
three

Кроме того, есть ли способ разделить на строку, а не символ? Чтобы я мог сделать Split("||")

6 ответов

Решение

Для вашего первого сценария вы можете передать параметр, на сколько строк разбить.

var text = "one|two|three";
var result = text.Split(new char[] { '|' }, 2);

Ваш второй сценарий требует немного больше магии.

var text = "one|two|three";
var list = text.Split('|');
var result = new string[] { string.Join("|", list, 0, list.Length - 1), list[list.Length - 1] };

Код не был проверен, чтобы проверить результаты перед использованием.

Метод Split принимает значение в качестве параметра, вы можете передать 2 в той позиции, которая в основном говорит, что вы заинтересованы только в 2 элементов максимум. Вы получите ожидаемый результат.

Для второго вопроса: нет встроенного в AFAIK. Возможно, вам придется реализовать это самостоятельно, разделив все и объединяя первое и второе.

C#'s String.Split() может принять второй аргумент, который может определить количество возвращаемых элементов:

string[] texts = text.Split(new char[] { '|' }, 2);

Ну, я воспринял это как вызов сделать второй в одной строке. Результат... не очень, в основном потому, что на удивление трудно перевернуть строку и сохранить ее как строку.

string text = "one|two|three";

var result = new String(text.Reverse().ToArray()).Split(new char[] {'|'}, 2).Reverse().Select(c => new String(c.Reverse().ToArray()));

По сути, вы обращаетесь к нему, затем выполняете ту же процедуру, что и первый, а затем сторнируете каждый отдельный, а также полученный массив.

Вы можете просто сделать это так же...

  //To split at first occurence of '|'


  if(text.Containts('|')){
  beginning = text.subString(0,text.IndexOf('|'));

  ending = text.subString(text.IndexOf('|');
  }

  //To split at last occurence of '|'
  if(text.Contains('|')){
   beginning = text.subString(0,text.LastIndexOf('|'));

  ending = text.subString(text.LastIndexOf('|');
  }

Второй вопрос был веселым. Я решил это так:

    string text = "one|two|three";

    var result = 
        new []
        {
            string.Concat(text.ToCharArray().TakeWhile((c, i) => i <= text.LastIndexOf("|"))),
            string.Concat(text.ToCharArray().SkipWhile((c, i) => i <= text.LastIndexOf("|")))
        };
Другие вопросы по тегам