2009-12-07 15 views
76

Estoy tratando de encontrar la mejor manera de obtener todo antes del caracter en una cadena. Algunas cadenas de ejemplos están a continuación. La longitud de la cadena antes - es variable y puede ser de cualquier longitudGet Substring - todo antes de cierto char

223232-1.jpg 
443-2.jpg 
34443553-5.jpg 

así que necesito el valor que es a partir del índice de arranque de 0 a derecha antes -. Así las subseries resultarían ser 223,232, 443 y 34443553

Respuesta

96

.Net Fiddle example

class Program 
{ 
    static void Main(string[] args) 
    { 
     Console.WriteLine("223232-1.jpg".GetUntilOrEmpty()); 
     Console.WriteLine("443-2.jpg".GetUntilOrEmpty()); 
     Console.WriteLine("34443553-5.jpg".GetUntilOrEmpty()); 

     Console.ReadKey(); 
    } 
} 

static class Helper 
{ 
    public static string GetUntilOrEmpty(this string text, string stopAt = "-") 
    { 
     if (!String.IsNullOrWhiteSpace(text)) 
     { 
      int charLocation = text.IndexOf(stopAt, StringComparison.Ordinal); 

      if (charLocation > 0) 
      { 
       return text.Substring(0, charLocation); 
      } 
     } 

     return String.Empty; 
    } 
} 
+1

Todos estos errores cuando "s" no tiene el guión. –

+2

Por favor, hazles un favor y agrega la comprobación de errores, suponiendo que planea hacer una función de esto :) – Josh

+0

Gracias estuve cerca de esto, pero tenía curiosidad si alguien tenía una manera diferente de hacerlo aparte de este combo. Pero sí, esto funciona muy bien y todavía es bastante corto. – PositiveGuy

42
String str = "223232-1.jpg" 
int index = str.IndexOf('-'); 
if(index > 0) { 
    return str.Substring(0, index) 
} 
+2

Esta respuesta es mucho mejor que las otras respuestas principales en mi opinión. – VoidKing

+0

Claro y fácil de leer, esta debería ser la respuesta aceptada. –

+0

upvote porque necesito saber el índice del separador –

2

Una forma de hacer esto es utilizar String.Substring junto con String.IndexOf:

int index = str.IndexOf('-'); 
string sub; 
if (index >= 0) 
{ 
    sub = str.Substring(0, index); 
} 
else 
{ 
    sub = ... // handle strings without the dash 
} 

de inicio en la posición 0, devuelve todo el texto hasta, pero sin incluir, el guión.

+0

si el índice <= 0 solo debe devolver string.empty. –

+5

@NRNR: si usted lo dice. El OP conoce los requisitos comerciales, no usted ni yo. –

74

Utilice la función split.

static void Main(string[] args) 
{ 
    string s = "223232-1.jpg"; 
    Console.WriteLine(s.Split('-')[0]); 
    s = "443-2.jpg"; 
    Console.WriteLine(s.Split('-')[0]); 
    s = "34443553-5.jpg"; 
    Console.WriteLine(s.Split('-')[0]); 

Console.ReadKey(); 
} 

Si la cadena no tiene un - continuación, podrás obtener toda la cadena.

+3

Y si tiene más de un guión, obtendrá múltiples elementos en su matriz. –

+2

De hecho, James, así que esto sería solo una solución si solo esperaba un solo guión. Supongo que podrías usar los métodos de Linq como saltar y agregar para obtener lo que querías, pero luego tienes más código que los métodos que ya se han propuesto. Todo depende de cuánto sabe sobre los datos entrantes. –

+3

Y unos pocos años después, me acabo de dar cuenta de que fui demasiado rápido para aceptar el punto de James.La pregunta pregunta cómo encontrar la cadena antes de un determinado personaje. Las instancias adicionales de ese personaje son por lo tanto irrelevantes, y tomar [0] "simplemente funcionaría". Por supuesto, todavía depende de cuánto confiemos en los datos entrantes. ¿Qué pasa si no hay '-' en absoluto? –

2

Las cosas se han movido un poco desde que este hilo comenzó.

Ahora, usted podría utilizar

string.Concat(s.TakeWhile((c) => c != '-')); 
+0

¿Cómo se compara el rendimiento con la combinación obvia de IndexOf y Substring? Supongo que está añadiendo cada carácter a un StringBuilder, y luego produciendo una cadena al final. También hay un par de llamadas de función mezcladas. Hubiera sido agradable si Substring simplemente pudiera tomar -1 como un argumento de "longitud" que significa "fin de cadena". – crush

+0

Es peor por la eficiencia. Como dices, utiliza un generador de cadenas y, al inspeccionar el código, parece llamar a ToString en cada carácter. Está más claro si está buscando más de un personaje, ya que podría reescribir el lambda fácilmente. –

Cuestiones relacionadas