2009-12-29 7 views
42

hoy me preguntaba si hay una mejor solución para realizar el siguiente ejemplo de código.Realizar Trim() durante el uso de Split()

string keyword = " abc, foo ,  bar"; 
string match = "foo"; 
string[] split= keyword.Split(new char[] { ',', ';' }, StringSplitOptions.RemoveEmptyEntries); 
foreach(string s in split) 
{ 
    if(s.Trim() == match){// asjdklasd; break;} 
} 

¿Hay alguna manera de realizar el ajuste() sin repetir manualmente cada elemento? Estoy buscando algo así como 'dividir por los siguientes caracteres y recortar automáticamente cada resultado'.

Ah, inmediatamente antes de la publicación encontré

List<string> parts = line.Split(';').Select(p => p.Trim()).ToList(); 

en How can I split and trim a string into parts all on one line?

Todavía tengo curiosidad: ¿Podría haber una mejor solución a esto? (¿O sería el compilador probablemente convertirlos a la misma salida de códigos que el LINQ operación?)

+0

definir "mejor" ... que quiere decir más legible? ¿Más rápido? – Ragepotato

+0

Más rápido/más rendimiento sin perder la legibilidad. Como el sombrero de Marc Gravell. – citronas

Respuesta

68

Otra opción posible (que evita LINQ, para mejor o peor):

string line = " abc, foo ,  bar"; 
string[] parts= Array.ConvertAll(line.Split(','), p => p.Trim()); 

Sin embargo, si sólo necesito saber si está allí, ¿quizás un cortocircuito?

bool contains = line.Split(',').Any(p => p.Trim() == match); 
+0

Oh, sí, estás absolutamente en lo cierto. Parece que tengo que acostumbrarme al Método Any();) gracias – citronas

+3

La respuesta en http://stackoverflow.com/questions/1728303/how-can-i-split-and-trim-a-string- en-partes-todo-en-uno-línea es más elegante tal vez? –

3

Yo sugeriría el uso de expresiones regulares en la cadena original, buscando el patrón "cualquier número de espacios seguidos por uno de sus delimitadores seguido por uno o más espacios" y eliminar esos espacios. Entonces divídese

+0

Regex, tampoco he pensado en eso, pero tienes razón, sería otra posible solución. gracias – citronas

+1

Estaría en contra de usar expresiones regulares para un problema tan trivial. Consulte http://www.codinghorror.com/blog/archives/001016.html con respecto a "ahora tiene dos problemas". – Eilon

+0

Bueno, no tengo esperanza para escribir expresiones regulares, y lo arruinaría, así que tampoco lo usaría TBH, pero este parece ser un patrón bastante simple para buscar y reemplazar, y hubiera pensado que sería más rápido que cualquier otro método que hace un .Trim() en cada elemento después de la división. – MikeW

1

Encontrarás muchos métodos diferentes para hacer esto y el cambio en el rendimiento y la precisión no serán evidentes. Recomiendo conectarlos a todos en una suite de pruebas como NUnit para encontrar cuál sale arriba Y cuáles son precisos.

Use cantidades pequeñas, medianas y grandes de texto en bucles para examinar las diversas situaciones.

3

Prueba esto:

string keyword = " abc, foo ,  bar"; 
string match = "foo"; 
string[] split = Regex.Split(keyword.Trim(), @"\s*[,;]\s*"); 
if (split.Contains(match)) 
{ 
    // do stuff 
} 
3

Si acaba de espacios rodea la palabras de la cadena separada por comas esto funcionará:

var keyword = " abc, foo ,  bar"; 
var array = keyword.Replace(" ", "").Split(','); 
if (array.Contains("foo")) 
{ 
    Debug.Print("Match"); 
} 
+1

omg, tampoco he pensado en eso. hoy no fue mi día =) – citronas

+2

Esta solución no funciona si un solo valor contiene 1 o más espacios. – Franck

1
var parts = line.Split(';').Select(p => p.Trim()).Where(p => !string.IsNullOrWhiteSpace(p)).ToArray(); 
Cuestiones relacionadas