2012-05-21 18 views
14

Me he encontrado con esto varias veces en el pasado y finalmente he decidido averiguar por qué.StringSplitOptions.RemoveEmptyEntries no funciona según lo anunciado

StringSplitOptions.RemoveEmptyEntries sugeriría que elimine las entradas vacías.

¿Por qué esta prueba falla?

var tags = "One, Two, , Three, Foo Bar, , Day , "; 

var tagsSplit = tags.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries) 
    .Select(s => s.Trim()); 

tagsSplit.ShouldEqual(new string[] { 
    "One", 
    "Two", 
    "Three", 
    "Foo Bar", 
    "Day" 
}); 

El resultado:

Values differ at index [2] 
    Expected string length 5 but was 0. Strings differ at index 0. 
    Expected: "Three" 
    But was: <string.Empty> 

Así se produce un error porque en lugar de "Tres", que tiene una cadena vacía - exactamente lo StringSplitOptions.RemoveEmptyEntries deben evitar.

Respuesta

26

Lo más probable es que cambie la cadena después de la división. Recorta los valores después de dividirlos, RemoveEmptyEntries no considera la cadena "" vacía.

El siguiente sería lograr lo que desea, creando básicamente su propia tira de los elementos vacíos:

var tagsSplit = tags.Split(','). 
        Select(tag => tag.Trim()). 
        Where(tag => !string.IsNullOrEmpty(tag)); 
0
var splittedTags = tags.Split(',').Where(str=> str != String.IsNullOrWhiteSpace(str)).Select (s=>s.Trim()) 
12

delimitadores adyacentes producir un elemento de la matriz que contiene un vacío cadena ("") . Los valores de la enumeración StringSplitOptions especifican si un elemento de matriz que contiene una cadena vacía se incluye en la matriz devuelta.

" " por definición no está vacío (en realidad es espacios en blanco), por lo que no se elimina de resultante matriz.

Si utiliza .NET Framework 4, que podría evitar que mediante el uso string.IsNullOrWhitespace method

var tagsSplit = tags.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries) 
       .Where(x => !string.IsNullOrWhiteSpace(x)) 
       .Select(s => s.Trim()); 
5

RemoveEmptyEntries hacerlo no significa espacio.
Su cadena de entrada incluye muchos "espacios". Debería notar que "espacio" no está vacío. En la computadora, el espacio es un código ASCII especial. por lo que el código:

var tagsSplit = tags.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries) 
    .Select(s => s.Trim()); 

significa:

  1. Dividir la entrada por '' y quitar entrada vacía, para no incluir el espacio. Entonces tienes una matriz con algunos elementos espaciales.
  2. Luego se recorta para cada uno de los elementos. Los elementos del espacio se vuelven vacíos.

Es por eso que lo tiene.

3

Trate

var tagsSplit = tags.Split(new[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries); 

Esto escupir por una coma y el espacio, y eliminar las cadenas vacías.

+0

Esto tratará incorrectamente la "Barra Foo" en la entrada del OP como dos elementos separados. – Giles

-2

Value.Split (new char [] {'/'}, StringSplitOptions.RemoveEmptyEntries);

Esto se dividirá por Slash. ¡Funciona completamente bien!

0

He buscado también por una forma limpia para excluir espacios en blanco entradas durante un partido, pero como todas las opciones parecían como una especie de soluciones, que he elegido para excluirlos cuando bucle sobre la matriz.

string[] tagsSplit = tags.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); 
foreach (string tag in tagsSplit.Where(t => !string.IsNullOrWhiteSpace(t))) { } 

creo que esto se ve más limpio y - como un bono - .Split(...).ToArray() puede omitir recayendo. Por supuesto, es una opción solo cuando puede bucle justo después de la división y no tiene que almacenar entradas para su uso posterior.

Cuestiones relacionadas