2011-05-22 17 views
6

¿Cuál es la mejor manera de dividir una cadena en solo dos partes utilizando un separador de un solo carácter?¿Cómo dividir una cadena en dos partes usando un separador de caracteres en C#?

La secuencia se debe dividir en la primera instancia del separador. El método debe considerar el rendimiento. No debe suponerse que el separador existe en la cadena, que la cadena tiene caracteres, etc. debe ser un código de propósito general que puede enchufar donde lo necesite.

(Siempre me toma unos minutos para volver a escribir este tipo de cosas cuando lo necesito, así que pensé en hacer una pregunta para él)

Respuesta

8

Si realmente quiere tener sólo dos resultados, utilice el método de cadena split con un segundo parámetro:

string[] words = myString.Split(new char[]{' '}, 2); 
+1

Eso puede devolver más de dos partes, no una cadena dividida en dos. –

+1

Agregué otra versión de String.split que podría hacer el truco. – slfan

+0

Oh, sí, siempre me olvido de esa versión de 'Split()' - eso es exactamente lo que quiero. – Rory

0
string[] SplitStringInTwo(string input, char separator) 
    { 
     string[] results = new string[2]; 
     if (string.IsNullOrEmpty(input)) return results; 
     int splitPos = input.IndexOf(separator); 
     if (splitPos <= 0) return results; 
     results[0] = input.Substring(0, splitPos); 
     if (splitPos<input.Length) 
      results[1] = input.Substring(splitPos + 1); 
     return results; 
    } 
+0

¿por qué hacer todo esto cuando ya hay un método como señala slfan. –

+0

@Roopesh: ¿Qué pasa si el carácter dividido ocurre más de una vez? –

+0

@Karlsen - hay una opción para eso. Verifique la respuesta actualizada de slfan. –

3
var part1 = myString.SubString(0, myString.IndexOf('')); 
var part2 = myString.SubString(myString.IndexOf(''), myString.Lenght); 
+2

Primero verificaría el carácter, para evitar una excepción en -1 en su segunda línea de código. –

+0

Es cierto, simplemente estoy asumiendo que él sabe que el carbón existe de antemano. –

+0

No puedo suponer que el carbón existe de antemano; eso es parte de lo que hace que esta no sea una pregunta completamente no trivial. También en cuanto a rendimiento, esto calcula IndexOf dos veces, que para una cadena grande puede ser significativo (aunque pequeño). También creo que part2 contendrá el carácter separador. – Rory

0

(siempre me toma unos minutos para volver a escribir este tipo de cosas cuando lo necesito, por lo que pensé en hacer una pregunta al respecto)

Si necesita esto con frecuencia, puede convertir su forma preferida de hacerlo en un extension method. Basado en la sugerencia de Teoman Soygul:

public static class StringExtensions 
{ 
    public static string[] TwoParts(this String str, char splitCharacter) 
    { 
    int splitIndex = str.IndexOf(splitCharacter); 
    if(splitIndex == -1) 
     throw new ArgumentException("Split character not found."); 

    return new string[] { 
     str.SubString(0, splitIndex), 
     str.SubString(splitIndex, myString.Lenght) }; 
    } 
} 
Cuestiones relacionadas