Estoy un poco confundido con el operador de rango de índice: esperaba que la expresión myString[..0] fuera equivalente a myString[0..0] , luego myString.Substring(0, 1) o myString[0].ToString() , y en el caso del código siguiente:
string myString = " abc"; string resultString = myString[..0]; el valor de resultString debe ser un solo espacio " " . Desafortunadamente, obtuve String.Empty :(
¿Alguien sabe por qué y me puede explicar, por qué estoy equivocado?
Los documentos de Microsoft no describen casos similares (o no puedo encontrarlos).
el valor de resultString debe ser un solo espacio " "
No, no debería.
El final de un rango es exclusivo , no inclusivo . Entonces, por ejemplo, x[0..x.Length] siempre devolverá la cadena completa.
En su caso, está diciendo "todo antes del índice 0", que obviamente es "la cadena vacía".
Esto está documentado en (aparte de otros lugares) la documentación de Range.End :
Obtiene un índice que representa el índice final exclusivo del rango.
El .. es una sintaxis para System.Range y el formulario que está utilizando
string resultString = myString[..0];se traduce en,
string resultString = myString[Range.EndAt(new Index(0, fromEnd: true))] En su caso, está intentando ..0 , lo que significa que todos los elementos que están antes del índice 0 y esa es la razón por la que obtiene el resultado como string.Empty
Documentación de MSDN para la propiedad Index.End
Obtiene un índice que apunta más allá del último elemento .
Podría ser más fácil considerar los índices en un rango como si estuvieran entre los caracteres , no apuntando a un carácter .
Si los caracteres de la cadena se rociaron en los paneles de la cerca, los índices en un rango se refieren a los postes de la cerca, no a los paneles de la cerca.
Cuando corta una cadena con rangos, obtiene todos los caracteres entre los índices. Cuando arranca los postes de la cerca de X a Y, los paneles de la cerca entre los postes se caen: obtiene los caracteres en los paneles caídos
var hw = "Hello world"; hw[0..11] //Hello world hw[..5] //Hello hw[0..0] //(empty string - there are no characters between index 0 and index 0) La razón por la que recomiendo pensar en índices en un rango entre caracteres es que hace que usar el ^n "desde la derecha" sea fácil de razonar. Tomando [^7..^2] tomará estos paneles:
o wor que te pongas a trabajar
Si pensara en los índices como apuntando a caracteres o paneles , entonces debe recordar a) "el final del rango es exclusivo" y luego también b) que hay un carácter imaginario agregado al final de la cadena que es ^0 , solo para que pueda excluirlo nuevamente. O tienes que pensar "los índices ^x son de la derecha, y si los usas le da la vuelta a la exclusiva", y luego tienes que pensar en alguna forma de recordar o averiguar cuál es el extremo exclusivo si volver a mezclar índices non-^ con índices ^ .
En general, es más consistente recordar "los índices están entre los caracteres" y "^ es de la derecha", luego puede mezclar y combinar lo que quiera:
hw[^5..^1] //worl hw[^5..10] //worl hw[6..10] //worl hw[6..^1] //worl