Ярлык для разделения только один раз в 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("|")))
};