2011-01-12 7 views
6

2 días, hubo una pregunta relacionada con string.LastIndexOf(String.Empty) devolver el último índice de cadena:String.Empty en las cadenas hace

Do C# strings end with empty string?

Así que pensé que; una cadena siempre puede contener String.Empty entre personajes como:

"testing" == "t" + String.Empty + "e" + String.Empty +"sting" + String.Empty; 

Después de esto, quería probar si String.IndexOf(String.Empty) regresaba 0 porque desde String.Empty puede haber entre cualquier caracter en una cadena, que sería lo que yo esperaba para volver y no estaba equivocado.

string testString = "testing"; 
int index = testString.LastIndexOf(string.Empty); // index is 6 
index = testString.IndexOf(string.Empty); // index is 0 

En realidad, regresaron 0. empecé a pensar que si podía dividir una cadena con String.Empty, me gustaría tener al menos 2 de cuerda y los que serían String.Empty y resto de la cadena desde String.IndexOf(String.Empty) devuelve 0 y regresaron String.LastIndexOf(String.Empty) longitud de la cadena .. Esto es lo que codifiqué:

string emptyString = string.Empty; 
char[] emptyStringCharArr = emptyString.ToCharArray(); 
string myDummyString = "abcdefg"; 
string[] result = myDummyString.Split(emptyStringCharArr); 

el problema aquí es, obviamente, no puedo convertir String.Empty-char[] y el resultado en una cadena vacía []. Realmente me encantaría ver el resultado de esta operación y la razón detrás de esto. Así que mis preguntas son:

  1. ¿Hay alguna manera de dividir una cadena con String.Empty?

  2. Si no es posible, pero en un mundo absoluto que sería posible, ¿devolvería una matriz llena de caracteres como [0] = "t" [1] = "e" [2] = "s" y así sucesivamente o simplemente devolvería la cadena completa? ¿Qué tendría más sentido y por qué?

Respuesta

1

¿realmente necesita a dividir la cadena, o está tratando de obtener todos los personajes individuales?

Si es así, una cadena también es IEnumerable<char>, y también tiene un indexador.

Entonces, ¿qué estás tratando de hacer realmente?

Y no, no puede llamar a los métodos de división con cadena. Construcciones vacías o similares.

+1

Dado que "ab" == "a" + string.empty + "b" esperaría que "ab" .split (string.empty) devuelva "a" y "b" y si pudiera obtener todos los índices de string.empty en "ab" esperaría que fuera 0,1. Entonces, MSDN establece que indexof (string.empty) devolvería 0 y lastIndex (string.empty) devolvería el último índice de cadena. ¿Significa que realmente comprueban si el parámetro entrante es string.empty y regresan desde allí o hay alguna lógica detrás? – Pabuc

+1

Pero, "ab" + string.Empty + "c", y luego divide eso, no obtendrías esas dos partes si pudieras, obtendrías 3 partes. string.Empty equivale a una cadena vacía, de ahí el nombre, y no puede encontrarlo realmente después de agregarlo a una cadena. –

+0

Sí, realmente comprueban el parámetro entrante. String.Empty no es un personaje especial, realmente es _nothing_. No se encuentra entre cada personaje, por lo que dividirlo no tendría sentido. En todo caso, debería devolver la cadena original. – Rob

2

Usted siempre obtendrá un índice de 0 cuando se mira para String.Empty en cualquier cadena, porque es la definición de String.IndexOf(String.Empty) usted debe echar un vistazo a la MSDN, donde dice:

"La posición del índice basado en cero del valor si se encuentra esa cadena, o -1 si no lo está. Si el valor es String.Empty, el valor devuelto es 0."

dirige a su segunda pregunta:

Creo que se puede dividir una cadena con una cadena vacía al hacer algo como esto en su código:

String test = "fwewfeoj"; 
test.Split(new String[] { String.Empty }, StringSplitOptions.None); 

Por cierto: Posible Clon esta respuesta Why does "abcd".StartsWith("") return true?

+0

Estás diciendo lo obvio, puedo ver que siempre obtendría 0 para IndexOf (string.empty) pero estoy buscando la razón detrás de esto y hago todo lo posible para descubrirlo. – Pabuc

+1

Porque está definido en la función que IndexOf (String.Empty) _always_ tiene que devolver 0. – basti

+0

Él le dio el motivo. Devuelve 0 cuando String.Empty se transfiere como un retorno de caso especial. – Rob

0

Desde String.Empty es sólo una cadena vacía, así que si lo hace:

var s = "part1" + string.Empty + "part2"; 

esto resultará en exactamente la misma cadena como:

var s = "part1" + "part2"; 

la primera sintaxis no va a insertar una cadena mágica vacía entre las dos partes.

Que IndexOf devuelve 0, es por definición, no porque haya alguna cadena mágica vacía entre los caracteres.

No puedo pensar en una forma lógica de dividir una cadena, por una cadena vacía. ¿Qué debería devolver? Cuando se usa una cadena vacía como argumento para la cadena. Método de división, se ignorará. Si fue el único separador para usar, la cadena se devolverá sin dividir.

+0

Esperaría que funcionara como ToCharArray y me diera una matriz de cadenas en su lugar. No arroja una excepción si lo intentas como yo lo hago, pero tampoco se divide con string.empty :) – Pabuc

0

también se podría decir

"testing" == string.Empty + string.Empty + string.Empty + ... + "t" + string.Empty + string.empty + "esting"; 

Así que en realidad podría colocar un sinfín de String.Empty entre cada carácter.

Así que creo 1 no sea posible ninguna 2, que sólo tiene sentido ... doens't

2

Sí, puede dividir cualquier cadena con una cuerda .Empty

string[] strArr = s.Split(string.Empty.ToCharArray()); 
+0

eso es lo que probé aún string.empty.tochararray devuelve una matriz de caracteres vacía. – Pabuc

1
string emptyString = string.Empty; 
char[] emptyStringCharArr = emptyString.ToCharArray(); 

Esto le dará una matriz vacía de caracteres. Esto se debe a que String ya es una matriz de caracteres en memoria, y String.Empty no tiene ningún valor.

descomponerlo aún más, considere una implementación de .ToCharArray()

private Char[] toCharArray(String value) 
{ 
    var stringLength = value.Length; 
    var returningArray = new char[stringLength]; 
    for(var i = 0; i < stringLength; i++) 
    { 
     returningArray[i] = value[i]; 
    } 
    return returningArray; 
} 

Duración del curso será cero, y volverá una matriz de caracteres vacía. Por supuesto, esta no es la implementación exacta, pero puede ver cómo y por qué no devuelve nada (y por lo tanto no se está dividiendo en la cadena como lo espera)

No es una matriz con un solo elemento String.Empty, porque eso realmente no tiene sentido. Cuando intenta dividir en una matriz vacía, no sabe cómo o qué dividir, por lo que se le devuelve la cadena original.

En cuanto a por qué se vuelve 0 por defecto, tenga en cuenta:

private int IndexOf(String value, String searchFor) 
{ 
    for(var i = 0; i < value.Length; i++) 
    { 
     if(value.Substring(i, searchFor.Length) == searchFor) 
     { 
      return i; 
     } 
    } 
    return -1; 
} 
private int LastIndexOf(String value, String searchFor) 
{ 
    var searchLength = searchFor.Length; 
    for(var i = value.Length - searchFor.Length; i >= 0; i--) 
    { 
     if(value.Substring(i, searchLength) == searchFor) 
      return i; 
    } 
    return -1; 
} 

String.substring (x, 0) siempre devolverá String.Empty, independientemente de lo que está pasado en (incluso String.Empty). Por esta razón, es mucho más rápido agregar un cheque y devolver 0 independientemente (como lo haría incluso si ejecutara el ciclo).

+0

Sí, claramente sé por qué (string.empty) .toCharArray no funciona :) Pero ¿por qué devolverían 0 o devolverían String.Length para IndexOf (string.empty) y LastIndexOf (string.empty)? ¿Cuál es la lógica? ¿Qué pasa si no lo hacen? – Pabuc

+0

Editado para mostrar lo que realmente sucede (no el código exacto obviamente ... solo la lógica de la función) cuando lo llamas. – Rob

Cuestiones relacionadas